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)且十分巧妙。这种解题思路,确实很值得学习。