1. 两数相加
示例:
分析:
老实人本来准备把两个链表转成整型相加再转回链表,被[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]教做人了,unsigned long都顶不住…
注意链表是实际数字的逆序,所以可以直接遍历相加,注意进位就行。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry = 0;
ListNode *sumList = new ListNode(-1);
ListNode *sumNode = sumList;
while (l1 != nullptr || l2 != nullptr){
int x = l1 != nullptr ? l1->val : 0;
int y = l2 != nullptr ? l2->val : 0;
int sum = x + y + carry;
if(sum >= 10){
carry = 1;
sum = sum - 10;
}else{
carry = 0;
}
sumNode->next = new ListNode(sum);
l1 = l1 != nullptr ? l1->next : nullptr;
l2 = l2 != nullptr ? l2->next : nullptr;
sumNode = sumNode->next;
}
if(carry != 0){
sumNode->next = new ListNode(carry);
}
return sumList->next;
}
};
执行用时:24 ms, 在所有 C++ 提交中击败了93.87%的用户
内存消耗:69.4 MB, 在所有 C++ 提交中击败了62.48%的用户
2. 无重复字符的最长子串
示例:
分析:
滑动窗口,判断重复字符,可以用unorderd_set,也可以遍历查找。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int start = 0, end = 0;
int len = s.size();
int max_count = 0, temp_count = 0;
char temp_char;
while(end < len){
temp_char = s[end];
for(int i = start; i < end; i++){
//出现重复字符,开始位置移到重复的下一位
if(temp_char == s[i]){
start = i + 1;
break;
}
}
end++;
temp_count = end -start;
max_count = max