本来计划这学期开学就开始刷LeetCode的,无奈拖延症严重,一直到校历第八周才正式开始刷题。以后计划每天做1~2道题吧,然后每周末写个总结回顾,也相当于是学习笔记了。
本来是想顺着序号写简单题的,看了知乎发现大家推荐先做top 100 liked,所以就先刷这个list上的简单题了。4.15~4.20做了四道题(two sum/reverse integer/valid parentheses/merge two sorted list),每一道题都能学到很多新知识啊,我是真的菜。
1、two sum
这道题用了map,是一个包含key和value的容器,key和value一一对应。
题目的思路大概是,从nums的第一个元素开始,判断它是否在map中,若不在就将target-nums[i]和i存在map中,然后判断下一个元素,直到map中含有这个元素,就将map中对应的key和此时的i输出。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int>store;
for (int i = 0; i != nums.size(); ++i)
{
if (store.find(nums[i]) == store.end())
store[target - nums[i]] = i;
else
return{ store[nums[i]],i };
}
return{};
}
};
其实我在写这道题的时候都不会调用成员函数,连.find和.end都不会用,实在是尴尬,一点一点学吧!
2、reverse integer
这道题没有用什么特殊的用法,就是取余一位一位取出来,然后再乘十加余数,就达到了反转的目的。
class Solution {
public:
int reverse(int x) {
int pop=0;
int res=0;
while(x!=0)
{
pop=x%10;
x=x/10;
if(res>INT_MAX/10||(res==INT_MAX/10&&pop>7))
return 0;
if(res<INT_MIN/10||(res==INT_MIN/10&&pop<-8))
return 0;
res=res*10+pop;
}
return res;
}
};
但是这里用到了INT_MAX,一开始很不理解这个为什么没给它赋值就可以用(我刚开始写的时候加的判断都是给出了具体的值。。),后来才知道是int型数据能表示的最大值。ps:这个判断过程还是很巧妙的。
3、valid parentheses
这个题目是判断括号的使用是否符合规范,又学到了栈stack的用法,大致了解了stack的成员函数,因为只能从栈顶操作,所以也没有pop_back这种,直接pop,push即可。switch的用法还是比较熟悉的。
class Solution {
public:
bool isValid(string s) {
stack<char> paren;
for(char&c:s)
switch(c)
{
case'(':
case'[':
case'{':paren.push(c);break;
case')':
if(paren.empty()||paren.top()!='(')
return false;
else
paren.pop();
break;
case']':
if(paren.empty()||paren.top()!='[')
return false;
else
paren.pop();
break;
case'}':
if(paren.empty()||paren.top()!='{')
return false;
else
paren.pop();
break;
default: ; // pass
}
return paren.empty();
}
};
4、merge two sorted list
这道题目是考察singly-linked list的用法,虽然开头给出了单链表的定义但我还是没有看懂 /笑哭,还是各种查资料,才大概明白这个list类到底应该怎么用,以及类对象定义为指针时,访问成员函数要用“->”,而不是用“.”。第一种方法还使用了递归,让我这个啥也不懂的人觉得,哇好厉害,原来这个也可以递归,太妙了!第二种方法,还不太理解dummy的用法,查资料也没太看到很好的解释,有机会向同学请教一下!
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
if (l1->val <= l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(INT_MIN);
ListNode* tail = &dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
};
这个代码有毒,复制粘贴了十几遍,总是乱码。。。
题目思路都是两个指针,将指向的数据较小的那个存下来,然后再往后比较。
本周虽然只做了四道题目,但也算是一个不错的开始了!以后会更加努力的!
短期目标:用两周时间,到5.5日,将top 100 liked里的easy做完!