LeetCode 02. 两数相加(链表) 03.最大不重复的字符串

 02题目如上图所示,其输入为一个两个链表,输出结果为两个链表。该题大体的意思为将链表中相对应的元素进行对应相加,然后将新的元素输入到结果链表中,但需要注意的问题是再当两个输入链表相加结果出现进位的时候,需要将进位加至下一级链表之中。题目答案如下:
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode pHead(0), *p=&pHead;
        int n=0;
       while(l1||l2||n)
        {
          int sum=l1->val  + l2->val+n;
            n=sum/10;
            p->next=new ListNode(sum%10);
            p=p->next;
           l1 = l1->next;
        l2 = l2->next ;
           
        }
        return pHead.next;
    }
};

程序新建一个链表,并建立一个flag n作为判断是否答案大于10的标志,若大于10,则n为1,否则为0。链表中元素的值即为

sum=l1->val  + l2->val+n;

相对而言该题难度不大,只需要对链表有一定掌握,就可以很方便的解决该问题。
03 最大不重复字符串

解题思路:因为题目要求只需要返回最长的字符串长度,所以新建一个字符串,每次增加时将元素插入字符串中,并记录其尺寸大小,当发现重复元素的时候将字符串清零,并从比较当前尺寸长度和最大的尺寸长度的大小,留下最大长度的字符串大小,若题目要求需要返回最大字符串时,也可以通过pair进行存储两个元素,来大到解题的目的。 代码如下:
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
       unordered_set<char> table;
        int tepCount=0;
        int MaxCount=0;
        for(int i=0;i<s.length();i++){
            auto iter=table.find(s[i]);
            if(iter==table.end())
                tepCount++;
            else{
                table.clear();
                tepCount=1;
               int j=i-1;
                while(s[j]!=s[i]){
                    table.emplace(s[j]);
                    j--;
                    tepCount++;
                }
            }
            table.emplace(s[i]);
            if(tepCount>MaxCount)
                MaxCount=tepCount;
        }
        return MaxCount;        
    }
};
当然在解题后,也发现了一种网友共享的相当简洁,并且非常有意思的解法。解法如下:
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
       vector<int> flag(256,-1);
        int start=-1;
        int MaxCount=0;
        for(int i=0;i<s.length();i++){
            if(flag[s[i]]>start)
                start=flag[s[i]];
            flag[s[i]]=i;
            MaxCount=max(MaxCount,i-start);
        }
        return MaxCount;
        }
};
因为只需要返回其最大长度,所以实际上并不需要对字符串进行任何处理,单纯通过数字即可解决该问题。通过一个容器,定义其初始为-1,很类似于哈希的一种解法,将字母分别位置分别存在不同的为之中,然后当再次发现该数的时候,将第二次时的位置和初始位置相减,就可以得到最大的长度。相对于一般解法,该事件复杂度为O(n)且十分巧妙。这种解题思路,确实很值得学习。

猜你喜欢

转载自blog.csdn.net/u010404530/article/details/79436420
今日推荐