力扣练习题 字符串最长无重复子串+两数相加

本文介绍了两种C++编程问题的解决方案:一是使用滑动窗口和std::unordered_set找到字符串的最长无重复子串;二是通过链表和取余运算实现两个数的相加。在解题过程中强调了对边界条件和指针操作的注意。
摘要由CSDN通过智能技术生成

废话不多说,菜鸡上路!

题目一 字符串最长无重复子串

解题思路:滑动窗口+std::unordered_set(不重复)

关于std::unordered_set的相关复习:

C++ STL unordered_set容器完全攻略 (biancheng.net)

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int max_len=0;
        std::unordered_set<char> ss;
        ss.insert(s[0]);
        int head=0,tail=0;
        while(tail<s.size())
        {
            if(tail!=0&&ss.find(s[tail])!=ss.end())
            {
                ss.erase(s[head]);
                head++;
            }else
            {
                ss.insert(s[tail]);
                tail++;
            }
            max_len=(max_len>(tail-head))?max_len:(tail-head);

        }
        return max_len;

    }
};

反思:

  • 字符串和字符数组,数组带索引,不必用字符指针来表示左右指针;
  • 注意极端情况:空字符串。一开始设置tail=1,默认认为字符串不为空,缺乏思考;

题目二 两数相加

解题思路:链表+取余除法运算

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry=0;
        ListNode *head=nullptr,*tail=nullptr;
        while(l1||l2)
        {
            int n1=l1?l1->val:0;
            int n2=l2?l2->val:0;
            int sum=n1+n2+carry;
            if(!head) head=tail=new ListNode(sum%10);
            else
            {tail->next=new ListNode(sum%10);
            tail=tail->next;}
            carry=sum/10;
            if(l1) l1=l1->next;
            if(l2) l2=l2->next;
            
        }
        if(carry>0) 
        {
            tail->next=new ListNode(carry);
            tail=tail->next;
        }
        return head;

    }
};

反思:定义指针要初始化(赋空/指向存在的空间/开辟新的空间),否则可能乱指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值