我在平时被同学问到过最多的问题之一就是面对如今有2000多道题目的Leetcode,应该按照一个什么样的顺序,怎么去刷题呢?今天就大家讨论一下刷题究竟应该怎么刷?
在进入刷题方法论的分享之前,我想聊聊三个常见的刷题误区,帮助大家摆正对刷题的观念,这样才能不焦不躁、脚踏实地刷题。
误区一:刷题可以在短时间内攻克
刷题是项系统性的工程,是一个提升你算法能力的过程,所以必须制定一个合理的计划才行。其实任何系统性的学科都是如此,更何况刷题这种CS试金石呢:只有打好基础,后面的学习才能事半功倍。
误区二:只刷高频题目就够了
很多的同学刷题的时候很喜欢刷高频题目,却没有去深入思考为什么高频题目之所以常被考的原因。高频题目之所以常常被考,就是因为考察的知识点很全面,很多高频题往往是由一些基础的低频题目延伸出来的。只刷高频题,却不去了解背后考察的知识点,其实是主次颠倒,这也就是为什么很多的同学会发现自己刷了很多题遇到新题又不会了的情况。
只有深入理解算法的基础知识,并掌握常见的基本套路后,加上系统性的练习计划,才能融会贯通,达到一道算法题到手,就快速想出正确思路的效果。
误区三:会做题就能拿下面试
刷题固然重要,但是不能有会刷题就一定能拿到offer的想法,面试是一个全方位的考察,算法能力,做题的能力固然是一个重要的考察方面,但不是唯一的方向,除了算法能力,你的沟通交流能力,对算法的解释的能力,接收面试官提示,优化算法的能力以及一些其他的软实力,也都是需要去努力提升的。
讲完了常见的一些误区,我们再来说一说究竟这题应该怎么刷:
1. 掌握一门基本的编程语言
如果你的语言能力和表现没有很强的话,我推荐使用Java用来刷题,首先Java语言本身就业市场很大,学这个找工作肯定没坏处,而且语言本身的设计也很优良。将Java作为面试语言,能传递给面试官自己有稳固编程基础的信号。当然如果你的Python基础很好的,用python也没有问题。这两种是面试最常用的语言。
2. 深入理解基础的数据结构
数据结构的掌握是正式刷题前的预备工作,也只有充分理解基础数据结构的原理,才能明白特定数据结构,之所以会在特定题型中常被使用的原因。理解不同的数据结构特性后,也会帮助我们更好地分析时间和空间复杂度。
3. 分类刷题
我们常考的算法类型完全是可以分类的,比如Binary Search,Recursion,DFS,BFS,我们刷题的时候一定要一类一类的刷,千万不要简单地按照easy, medium, hard的顺序来随机刷题,很容易越刷越乱,无法建立成体系的刷题套路。
一类的题目是有很高的相似度的,解题方式和思路上很多时候也是类似的,这样一类一类的题目刷会更容易帮你总结出这一类题目的思考方式和解题方法。当然一类的题目数量也很多,你可以按照频率从高到底去做,完全没有问题。
还有的同学会问刷题是需不需要考虑easy刷多少题,medium多少题这样,我觉得在刷题过程中并不太刻意的去关注这个,就按照frequency一题不落的往下做就行了。