刷题这件事情本身也是需要「方法」的。
我们针对算法面试准备的算法题,不是智力题,我们觉得刷题有困难,有很大一部分是心理上的因素。其实这一类算法问题非常像我们初高中的数学问题,知识点很多,都有相对固定的思考方向和常考的知识点,答案和思路也是相对固定的。
刷题这件事情我觉得一开始以培养兴趣为主,从易到难做,同类问题一起做(按标签)做,是我看到的绝大多数朋友刷题的方式。
「力扣」的「探索」模块就是适合入门的地方。你可以从「数组」「二分查找」「字符串」「链表」这些模块开始做起,这些模块需要的基础知识较少,并且「探索」板块本身就是一个小的教程。通过知识讲解和练习是可以掌握这一类问题的通用的做法的。
刷题建议
做题的时候需要先仔细读题,把题目中的文字描述细节和示例看一下,然后再看看输入数据的范围,确保自己明确了题意以后想思路,然后再编码。
编码遇到问题,测试通不过是非常正常的事情。这个时候首先思考是不是本身思路上就存在问题,可以根据不能通过的测试用例,检查自己的思路在哪一方面没有考虑周到。如果是思路正确,那就是在编码实现的时候遇到的问题,这其实是比较考验耐心的。调试程序本身就是一种需要训练的能力,一个简单而有效的方法就是在程序的关键的地方,做一些 System.out.println(i); 之类的打印输出,观察数据是否按照我们所设定的流程执行下去。这件事情看起来枯燥,但是是作为程序员的基本技能,只能靠自己训练获得。
如果一道问题自己没有思路,完全可以直接看别人的思路。如果别人的思路看不懂,没有关系,看不懂就跳过。看不懂在一些情况下不是问题,不同的朋友表达的方式和语言不一样。写题解和博客的朋友不可能都从头开始写,每个人写题解的侧重点也不同,会假设读者有的算法和数据结构的知识也会不同。
看完别人的思路,觉得合理可行,再自己尝试编码。遇到问题再去比对别人给的示例代码。
即使是自己独立做完的问题,也很有必要在做完以后看看别人的思路,这一步也会让自己学习到很多。
用好收藏夹
实在不懂又很想搞清楚的问题,不妨就放在收藏夹里,「力扣」本来就有提供收藏夹功能。也可以给自己刷题的 GitHub 仓库提交一个 issue ,把这道题和自己找到相关的参考资料写进去,提醒自己以后花时间去搞清楚。今天怎么想都不明白,过两天一下子就想通的事情也是常有的。因为有些时候学习和思考问题,个人的情绪和状态也是有关系的。
还有一些比较难的问题,一开始先别去碰,可以先看看题目的意思,不感兴趣就不做,感兴趣的话,不强求自己一定要做出来,就放在那里慢慢花时间搞懂,也是常有的事情,一道题可能重启 4 遍到 5 遍才搞懂是非常正常的,而且这样的问题如果最后自己真的搞定了以后是很有满足感的,力扣的第 4 题、第 5 题、第 47 题、第 41 题、第 300 题,第 42 题、第 84 题差不多就是类似的问题,即使是刷了很多遍以后,我都不敢说我完全搞懂了这些问题,就让它们在收藏夹里先吃灰叭。
尝试表达输出,尽量用简单、通俗的语言描述自己的思路
在刷题的过程中,需要自己总结这一类问题的特点,然后用自己的语言表达,写博客、题解或者是和一起刷题的小伙伴讨论。这些虽然不是写代码,但也属于刷题的一部分,可以积累下来形成刷题的「数据」,以后不论是找工作还是自己复习都是十分有帮助的,我和很多小伙伴都是这么做的。
养成好的编码习惯
刷题不是只有“数量”这个指标,即使是同样的思路,不同的人写出来的代码也会有很大差异。怎么写代码也是需要自己总结和训练的。代码格式良好,有恰当的、必要的注释,让别人能够很清楚地了解自己的思路,也是需要慢慢锻炼的。虽然刷题是个人行为,但是在写代码的时候按照写工程代码的标准来要求自己,我个人觉得是非常有益处的,我自己也是坚持这么做的,可以让自己避免很多坑和不必要的麻烦。
不只是为了面试而刷题
刷题这件事情对于绝大多数朋友,也包括我,目标主要是在面试中得到一个好的成绩,找到一份好的工作。但刷题的过程是很值得经历的,从焦虑到欣喜,再到焦虑和自我怀疑,然后又莫名其妙自我感动,都是很正常的。
把「力扣」的算法题就想象成解决一个一个日常生活中遇到的问题,我们写的「算法」就是解决这些问题的方法,而「数据结构」是存储和处理数据的容器,是我们可以利用的工具,很多是现成的编程语言的函数库就提供给我们使用的。
不要把刷题想得很难,很多时候只是心态的问题
刷题比起很多工作,例如机器学习里的公式推导、打一些数据挖掘竞赛、很多研究生朋友写科研论文,是要简单得多,甚至比起大家考研的时候学习的高等数学、线性代数、概率论与数理统计都要简单很多,要相信自己一定可以慢慢拿下的。
不要有太大压力,一道题做得出来做不出来,都不能说明太大问题,做对了有可能是侥幸,做错了也有可能是一时头脑短路或者是题目不对味口。
我有一位非常好的朋友,他是科班出身,听他说他以前刷题的时候,没有思路得去找学长讨论,LeetCode 当时还没有中文社区,看思路和题解、和别人交流得用英文。现在其实我们方便很多了。
刷基础算法问题和智商绝大多数情况下没有关系(刷 ACM 等竞赛题库除外),我个人觉得是和「态度」有关。可以想一想自己是不是认真地在刷题,参考资料和视频讲解手上都有,还搞不清楚,是不是自己花的时间不够,或者说没有找认真找合适的资料,或者就是自己想偷懒。
适合自己的刷题方式也是需要慢慢摸索的,一开始需要一些帮助和基础知识储备是必要的。后期就是查缺补漏,重点训练了。一开始不要过于执着一个问题,一个问题没有搞清楚,就放一放,问题很多,不可能全部做完,也不可能全部搞懂。自己需要合理分配时间和精力。
即使是「回溯算法」「动态规划」「贪心算法」「哈希表」「红黑树」这样高级的数据结构和算法,它们确实很复杂、很难,但是它们的基本思想是很简单的,或者说它们就是从一个很简单的样子一点一点变化,变成我们现在看到的这个样子,绝大多数算法思想都可以在我们的生活中找到对应的例子去理解它。
「力扣」的周赛其实也是很适合新手的,我现在想做的时候,也都会去做一下周赛,然后会和固定的小伙伴交流做题心得,有的时候也就是简单汇报一下自己做出了哪题,哪题实在想不出来,或者吐槽一下一些问题题目太长或者题意难懂实在不想做。有些朋友会误解我可能做那些问题会很轻松,其实不是的,我现在做周赛也就 2 题到 3 题,从来没有 4 题都做完过。头几次周赛一道题都没做出来就是我了。可以把每次周赛就当做是一次模拟的笔试、有很多小伙伴陪我们一起做,找找感觉,我想说的是,而且一定会有真·大佬出来,在「力扣」的「圈子」板块和题解区、评论区分享它们的做题思路和代码,在一些视频网站也可以看到他们的比赛实况和赛后讲解,讲得都非常不错,我们可以趁机向他们学习。
个人观点,仅供参考。
作者:liweiwei1419
链接:https://leetcode.cn/circle/discuss/xFI0Il/view/ReA0Nq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。