您的位置:首页 > 其它

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

2018-03-04 14:51 477 查看

 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)且十分巧妙。这种解题思路,确实很值得学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐