C++ - leetcode中级算法题(一)

前言

如果编程只是重复敲一些没有价值代码,
那不是我所向往的编程生活。
如果生活只是重复做一些没有枯燥无味的事情,
那不是我所向往的生活。
所以,我们始终要为心底坚持的美好而努力。

本篇目录

两数相加

题目:给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

已过答案:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        
        ListNode *l3 = new ListNode(0);
        ListNode *tempList = l3;
        int num = 0;
        
        while (l1 || l2) {
            
            if (l1) {
                num += l1->val;
                l1 = l1->next;
            }
            
            if (l2) {
                num += l2->val;
                l2 = l2->next;
            }
            
            tempList->next = new ListNode(num%10);
            num /= 10;
            tempList = tempList->next;
        }
        
        if (num > 0) {
            tempList->next = new ListNode(1);
        }
        
        return l3->next;
    }
};

解析:

  1. 考察c++类构造函数,初始化列表等基础概念
  2. 考察最基本的c++链表操作
  3. 算法级别如题,属于小学加减题

无重复字符的最长子串

题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

已过答案

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
        // 判空
        if(s.empty()) {
            return 0;
        }
        
        string result(s,0,1);
        int temp = 1;
        int maxCount = 1;
        int tempCount = 1;
        
        while (temp <= s.size()-1) {

            string str1(s,temp,1);
            char *str = strrchr((char*)result.c_str(),*str1.c_str()); 
            
            if (str == NULL) {
                result = result + str1;
                tempCount += 1;
            }else {
                string tempStr = str;
                string needStr(tempStr,1,tempStr.size()-1);
                result = needStr + str1;
                tempCount = result.size();
            }
            
            if (tempCount > maxCount) {
                maxCount = tempCount;
            }
            
            temp++;
        }
        return maxCount;
    }
};

考点

  • c++基础知识
  • c++字符串基本操作
  • 基本逻辑操作

思路

从首字符串开始,依次和下一个index的字符对比,
如果不包含则合并两个字符串,
如果包含,从与该字符相同的最后一个字符index+1开始合并,直到末尾

该算法还有较大优化空间,好晚了,先这样。。。

    原文作者:tigerAndBull
    原文地址: https://www.jianshu.com/p/baa346c18f98
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞