一、LeetCode:445. 两数相加 II
(1)题目描述:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0]
输出:[0]
(2)问题分析:
做这道题的时候想了10分钟左右,没有实现出来,最后看了题解,题解很多大佬都说,碰到逆序处理都应该想到栈。。。。
(3)代码实现
/**
* 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) {
stack<int>s1,s2;
while(l1!=NULL){
s1.push(l1->val);
l1=l1->next;
}
while(l2!=NULL){
s2.push(l2->val);
l2=l2->next;
}
ListNode* ans=NULL;
int carry=0;
while(!s1.empty()||carry!=0||!s2.empty()){
int a = s1.empty() ? 0 : s1.top();
int b = s2.empty() ? 0 : s2.top();
if (!s1.empty()) s1.pop();
if (!s2.empty()) s2.pop();
int cur=a+b+carry;
carry=cur/10;
cur%=10;
ListNode* curnode=new ListNode(cur);
curnode->next=ans;
ans=curnode;
}
return ans;
}
};
二、LeetCode:219. 存在重复元素 II
(1)题目描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
(3)问题分析:
去除存在元素,首先要想到哈希表,map集合,set集合,最后代码实现,这道题可以有效地训练我这种新手对容器的理解。
(3)代码实现
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int>mps;
for(int i=0;i<nums.size();i++){
if(mps.count(nums[i])){
return true;
}
mps[nums[i]]=i;
if(mps.size()>k){
mps.erase(nums[i-k]);
}
}
return false;
}
};
772

被折叠的 条评论
为什么被折叠?



