为什么开始刷题
本人在校招时没有好好刷过题,误打误撞进了某大厂。目前担任算法工程师已快两年,不会leetcode算法题已经成为我的心理障碍,在为公司面试新同学时和自己想去看看新机会时总是信心不足,遂下定决心补上偏科、还上校招时欠下的债。
之前一直觉得leetcode和剑指offer是程序员届的八股文,只是在面试时用来筛人的一道门槛,平时工作中没什么用。自从我下定决心开始刷题,到现在有三个月,确实体会到自己在编程语言的掌握和数据结构与算法的理解上更进一步了,并且只有内化了的知识才能在工作里学以致用。所以开了这样一个专题帖,总结一下之前刷过的经验,也希望以后能常刷常新。
刷题的打开方式
如果你刷leetcode很痛苦,不知道该从哪道题刷起,不知道该怎么刷,每道题都没有思路,就算有思路也写不出代码,每道题都要磨很久还不能Accept,刷过了的又忘了…那么你一定要看看我刷题的打开方式:
- 首先,找一份优秀的参考资料,站在巨人的肩膀上训练自己的大脑。“优秀”指的是要:按题目类型来组织;有思路和答案;参考答案的编程语言是你比较熟悉的。我用的是Leetcode 101(C++) ,里面部分看不懂的题目就看这个付费视频的讲解AlgoCasts(Java)。
- 然后,对着参考资料从头到尾刷一遍所有的题目。每道题读完先自己思考下可能的思路(不超过5分钟),就去看参考资料给的解题思路和代码。看懂了就自己在leetcode上默写一遍看是否能Accept,没有Accept就分析下原因或对照参考资料一一校正;实在没看懂的话,可以看下AlgoCasts(Java)里有没有这道题的讲解,如果有一般看视频都能看懂,如果没有就把参考资料里的代码抄一遍到leetcode,边抄边理解每个变量是什么含义,一般抄到最后都能理解出80%左右。把自己的理解、错的地方、不懂的地方简要记录下来,方便二刷的时候有的放矢。每道题限时1h,不要上来就自己撸,第一遍刷心安理得先看答案,通过标准答案去监督训练自己的大脑神经元。只有做过足够多的题目之后才能做到举一反三,盲目自己撸只会是浪费时间。
- 重要的是,坚持刷完。不管有多忙、有多难、有多慢、前面的忘了多少,坚持往前刷完这一遍,刷的过程中做好笔记,代码里写好注释。只有见过了足够全的题目,才会在看到新题目的时候知道该用哪一块的知识去解,避免管中窥豹。
- 二刷和总结。这是我现在正在进行的,我想在二刷的时候做到几点:1. 归纳题型;2. 看懂之前没理解的题,在没有提示下能Accept之前理解了的题,尝试写出每章后面的练习题,搞清楚每道题的时间复杂度和空间复杂度,搞清楚每道题目有几种解法;3. 记录下来,以后可以回头看。
算法题型总结
之后的博文,我会按照Leetcode 101(C++) 的顺序,每篇写一个题型的总结,主要有以下题型(图片来自于leetcode 101):