两数之和
1.链表问题
链表是一种数据结构,val表示链表的当前位,默认从第一位开始。next表示链表的下一位。链表在执行下一位赋值时需要判断当前位是否为空,否则无法进行赋值操作。
2.循环问题
对于两数之和问题,关键点在与反向表和进位,因此设置tail和final两个链表,w为sum和进位。
w = l1.val + l2.val
tail = w % 10
tail = tail.next
w = w/10
head = tail
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int w = 0;
ListNode* final = nullptr;
ListNode* tail = nullptr;
//最终链表final和其反链表tail
//
while(l1|| l2|| w!=0)
{
if(l1)
{
w += l1->val;
l1 = l1->next;
}
if(l2)
{
w += l2->val;
l2 = l2->next;
}
if(!final)
{
final = tail = new ListNode(w%10);
}
else
{
tail->next = new ListNode(w % 10);
tail = tail->next;
}
w = w /10;
if(w>0)
{
tail->next = new ListNode(w);
}
}
return final;
}
};
无重复字符串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//定义一个哈希列表
unordered_set<char> map;
//得到s的总长度
int n = s.size();
//定义指针变量r和最终结果
int r = -1,result= 0;
//滑动窗口循环从一个字符开始
for(int i = 0 ;i<n; ++i)
{
//从第二个字符开始每次从哈希列表中移除最开始的指针
if(i!=0)
{
map.erase(s[i-1]);
}
//判断条件,1字符串s的范围内,2哈希表中没有重复的字符
while(r+1<n && !map.count(s[r+1]))
{
//每次插入一个新的字符
map.insert(s[r+1]);
++r;
}
//每次取一个最大值,知道遍历完整个字符串
result = max(result,r-i+1);
}
return result;
}
};