从今天开始,以诺正式开启一个全新的关于如何刷题的教程:《LeetCode刷题套路教程》。在正式进入这个系列的介绍之前,我会聊一聊刷题方法的重要性,以及常见的三个刷题误区,还有刷题的方法论。

刷题方法的重要性

要论方法论的重要性,我想先分享一个小故事:以诺刚来美国读高中的时候,爱上了健身,每天一下课就去健身房练上将近两个小时,其中包括一个小时的无氧和半个多小时的有氧。虽然最后也练得挺壮的,但却因为训练方式的不正确和错误的饮食方法,造成肌肉拉伤,肌块不对称,以及永久性的膝盖劳损。后面也不得不暂停训练,花了将近半年的时间重新调整饮食结构、制定正确合理的训练计划。最后复出不仅仅让自己的训练更轻松,而且效果更显著。

与健身相比,刷题这种纯脑力活动就更需要系统合理的方法论。以诺作为一名到大三才开始上第一节编程课的转专业小白,在找工作和刷题的道路上踩了太多的坑了,我当时也上过各种算法班,啃了刷题圣经《Cracking the Coding Interview》和《Elements of Programming Interviews in Java: The Insider’s Guide》,但是最后也成效甚微,反而更加焦虑和迷茫,中途甚至有过放弃的想法。

幸好凭着我的韧劲,做了很多的调整,打好基础后又重装上阵,最后才一步一步走上刷题的正轨,后面也拿到了两份实习的经历,目前也拿到了一份心仪的暑假工作offer。

我举这些例子的目的是告诉大家,不管做任何事情,努力不代表就有好结果,很多时候用错误的方法学习,如果只是浪费一点时间和精力还不算太糟糕,但如果造成对要做的事,产生厌恶心理,最后半途而非,那才真的是可惜。对于刷题这种系统性工程,我们必须要制定合理的计划,才能脚踏实地完成目标,达到事半功倍的效果。

三大刷题误区

在进入刷题方法论的分享之前,我想聊聊三个常见的刷题误区,帮助大家摆正对刷题的观念,这样才能不焦不躁、脚踏实地刷题:

刷题可以在短时间内攻克

刚开始刷题的时候,我天真地以为有一种方法可以让我快速掌握算法,当时作为转专业的我也浪费了很多时间寻找相关的资源,被个别贩卖焦虑的机构割了韭菜(主要是我心态太急,没有打好基础就开始盲目刷题)。

走了很多弯路后,我才开始正视刷题是项系统性工程的事实,必须制定一个合理的计划才行。其实任何系统性的学科都是如此,更何况刷题这种CS试金石呢:只有打好基础,后面的学习才能事半功倍。(再简单不过的道理:如果一个房子的根基搭得不好,上面堆再多的砖瓦,最后的结局都是坍塌。)

只刷高频题目就够了

当时刷题的时候很喜欢刷高频题目,却没有去深入思考为什么高频题目之所以常被考的原因。高频题目之所以常常被考,就是因为考察的知识点很全面,很多高频题往往是由一些基础的低频题目延伸出来的。只刷高频题,却不去了解背后考察的知识点,其实是主次颠倒,捡了芝麻,丢了西瓜。而且只靠背题往往会造成花了很多时间,可是一遇到新题目,却还是无从下手的窘境。

只有深入理解算法的基础知识,并掌握常见的基本套路后,加上系统性的练习计划,才能融会贯通,达到一道算法题到手,就快速想出正确思路的效果。

能解题就能拿下面试

以诺第一次面试的时候,我记得很清楚,当时是电面完之后的第一个onsite,面试官的第一个问题,竟然是让我解释电面题目的思路,当时完全没头绪,结果可想而知。虽然当时我在LeetCode网站上解题能力OK,可是因为没有总结系统性的刷题套路,只知道让程序运行成功,却无法完整阐述解题过程。

随着面试经验的累计,我发现虽然面试表面上考察的是算法,但若想拿下面试,我们需要展示更多的软实力才能让面试官心满意足:其中包括有逻辑性地阐述自己的思路,能够快速抓住面试官的提示,改进并优化算法。只要我们掌握解决算法的基本套路,加上平时多和身边伙伴进行模拟练习,最后是绝对可以从容面对任何面试的。

这些都是以诺实实在在踩过的雷区。回想当初,要是当时有个有经验的朋友能够带带我,可能我就能用更短的时间入门刷题,而且也能更系统地通过刷题,掌握算法知识点吧。但是当年以诺准备面试的时候,LeetCode也刚成立不久(2015),网上关于刷题方法论的资源也不多,可能这个摸着石头过河的经历也在所难免吧。(但是多亏了当时那段刷题的痛苦经历,让我能够切身体会基础薄弱朋友的窘境,为我成立图灵星球这个平台的念想埋下了种子。)

刷题方法论(刷题三步走)

看完这些内容之后,小伙伴也不要慌张,觉得刷题是项浩大的工程。其实刷题无非就是一项孰能生巧的技术,不是什么玄学或者艺术,只要打好基础,按照系统科学的步骤,一步一步坚持下来,解决算法的能力是能够在不长的时间内培养出来的。那以下就是我依据多年的刷题经验,总结出来的刷题三步走:

1. 掌握一门基本的编程语言:很多刷题小白喜欢使用JavaScript或者Python这些动态或脚本语言,因为语言本身简单,但若将这些语言用于刷题,有很大几率会让面试官误以为你不是科班出身,造成心理上的落差。我强推面对对象语言Java用来刷题,首先Java语言本身就业市场很大,学这个找工作肯定没坏处,而且语言本身的设计也很优良。将Java作为面试语言,能传递给面试官自己有稳固编程基础的信号。
2. 深入理解基础的数据结构:数据结构的掌握是正式刷题前的预备工作,也只有充分理解基础数据结构的原理,才能明白特定数据结构,之所以会在特定题型中常被使用的原因。理解不同的数据结构特性后,也会帮助我们更好地分析时间和空间复杂度。
3. 按照特定模块进行系统性刷题:千万不要简单地按照easy, mid, hard的顺序来随机刷题,很容易越刷越乱,无法建立成体系的刷题套路。只有按照特定的算法分类进行针对性学习,比如每周只针对特定的算法分类(DFS, BFS, …)进行学习,才能快速掌握特定算法的套路,还能发现不同题目之间的共性特征,达到事半功倍的效果。


对于没有Java和数据结构基础的小伙伴,大家可以通过图灵星球发布的教程进行基础的巩固。切记基础为重,根基稳固后再进入LeetCode系列的学习,才能茁壮成长。

《LeetCode刷题套路教程》内容

教程的由来

其实我很早就想分享和刷题相关的一些内容,可是刷题系列相比于其他的教程需要花费更多的时间和精力,一旦选择出刷题教程,可能就无法出一些与编程基础相关的内容了。

直到以诺和自己长期并肩作战(刷题 + Mock Interview)的好朋友戴瑞在一次吃饭的时候,无意间聊起关于LeetCode刷题系列的话题,我们一拍即合,对通过分享知识,帮助更多小伙伴的这一共同愿景达成一致,快速整理并设计出了我们满意的教程大纲。

也多亏了疫情,我和戴瑞在硅谷的工作机会变成了远程办公(wfh),省去了我们搬家之类的麻烦。那借着这段疫情在家工作之外的时间,我们会尽量保持周更,尽快完成这个系列,帮助和我背景相似(转专业),还有那些想要在美国找工作的小伙伴,在刷题的道路上少走一些弯路。

教程的内容

关于《LeetCode刷题套路教程》,我们每一期会根据特定的算法类型,结合经典题目讲解不同的刷题套路,帮助大家获得解决算法题的利器,建立起完善的刷题体系。虽然LeetCode还在不断更新,但是最重要和常见的算法类型不过以下几种,我们也会根据下列类别进行教学:

  • Array, Binary Search, Linked List
  • Stack, Queue
  • HashMap, Heap
  • Graph, Tree
  • Searching, Dynamic Programming
  • Greedy, Maths
  • Advanced topics (Union Find, Topological Sort, Trie, …)


简单来说,其中包含各种题型的常见模板,能够帮助大家识破题型,迅速将思路化为代码。在每章中,也会列出一些额外的经典题目,帮助大家进阶练习。(切记要结合实践巩固知识点,才能吃透套路)

《LeetCode刷题套路教程》是我和戴瑞结合了我们多年的刷题和面试经验,总结出来的沤心之作。真心希望通过我们教程的分享,帮助更多刚开始刷题却无从下手、和那些刷了一堆题却还没有明显进展的小伙伴们。只要大家认真学习完这个系列,肯定能建立起对刷题的系统性认知。

也希望小伙伴们摆正心态,不要焦虑,脚踏实地地按照教程顺序,根据题型制定针对性的学习计划。最后也祝愿大家可以凭借自己的努力,在这个多事之秋拿下心意的offer!