废话不多说,菜鸡上路!
题目一 字符串最长无重复子串
解题思路:滑动窗口+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;
}
};
反思:定义指针要初始化(赋空/指向存在的空间/开辟新的空间),否则可能乱指