数据结构与算法面试宝典 - 前微软资深软件工程师 - 拉勾教育
专栏的最后一篇内容,我想和你聊聊天,讲一讲我平时如何磨炼自己的算法能力。我会从目标、方法、执行力这三个方面展开,和你分享我总结出的一些经验。但是没有一把万能的钥匙可以打开所有的门,所以你还需要根据自身的情况对 “我的总结” 做一些调整。
目标
我有一个朋友在准备算法的时候,首先想到的是找到最牛逼的书,然后开始啃书,比如《算法导论》。其实,要做的第一件事,应该是确定目标。你可以思考一下:
- 你的目标是能够流畅地通过一线大厂的算法面试吗?
- 你的目标是要去参加一些算法竞赛吗?
- 你的目标是要成为算法领域的大牛吗?
这里面,每一个目标需要花费的精力、制定的路线都不同。如果你要参加算法竞赛,那么需要掌握的数据结构 / 算法要多得多,而多出来的这部分知识只有极低的概率会出现在大厂的算法面试中(比如数论算法)。
我想,阅读这个专栏的同学,大多数制定的目标应该是通过大厂的算法面试。所以这里我们暂且将目标定为通过面试。如果你在刷题或者看书的时候,看到一些超纲的知识点,其实可以降低优先级,跳过它。那么哪些知识点是超纲的呢?我在学习算法前,会有针对性地罗列一下大厂面试中高频出现的知识点,如下图所示:
在后面看书、刷题的时候,99% 的精力会花在这些知识点上,暂且不去理会超纲的题目。而只有这些知识点都烂熟于心之后,再去学习一些超纲的知识点。
学习方法
每个人的基本情况不同,那么这里,我会从基础能力由弱到强说起。你可以根据自身能力跳过某些阶段。
基础扫盲
如果你以前的专业不是计算机,或者你以前并没有接触过算法与数据结构。你首先需要做 1 件事情:
- 拿一本基础入门的书 / 专栏,把基础的知识点都过一遍。
这个阶段不建议看《算法导论》《计算机程序设计艺术》等大部头的书。我一般是挑一本比简单的书或者某个网课 / 专栏把这个阶段尽快过掉。
这个阶段看书要达到的效果是:要知道各种基础概念(比如 DFS/BFS / 回溯等)、各种基础数据结构(二叉树 / 链表 / 哈希等)、基础算法名词(贪心 / DP 等),都要弄明白说的是什么。这一阶段,你不需要达到能够写出各种代码的程度,只需要看懂书上的代码,会用笔通过画画的方式,来解决数据结构和算法的某个具体的输入。 比如:
- 当给定有序数组 A[] = {1,2,3,4,9} 的时候,你能用笔写出二分搜索的流程。
接着做第 2 件事情:
- 重新打开书,按照知识点的顺序,打开你喜欢的刷题网站,每个知识点先刷 10 道左右简单题。
这个阶段花费的时间,根据个人情况,一般 1 个月左右。此外,你的目的是过掉各种基础知识点,所以不需要看很多书。
刷题阶段
先说一个简单的结论:跟着本专栏走!
因为当基础知识扫盲之后,接下来就需要通过实践来提升我们的算法能力。在刷题阶段,我们的目标是击破中等难度的题目。
阶段 1:一解多题
这一阶段是以知识点为出发点,我们需要按照以下方式来刷题。
- 高频出现的知识点作为 Tag,只刷这个 Tag 中等难度的题目!
- 看题解!无论一个题是否 Resolve,一定要看题解!
- 抓住数据结构与算法的特点!形成一解多题的能力。整理代码模板!
你会发现,这正是我们专栏《模块一:数据结构之一解多题篇》介绍的内容。这个阶段的产出,就 3 个字 “写得出”。比如当我直白地告诉你需要用 DFS / 回溯 / 二分的时候,你能快速地把相应的代码写出来。
注意:这一阶段不要按照刷题网站的顺序,按照题号来刷题,这样做效率非常低!
此外,整理好的代码模板还需要用起来。所以,这里我再讲一下如何将代码模板放到 Vscode 中,方便你在后面的写题中加快刷题的速度(制作代码模板的网站)。
Step 1. 输入模板关键字和描述。
Step 2. 放上并查集的模板代码。
Step 3. 复制整个 json 格式的代码模板。
Step 4. 打开 Vscode,找到 User Snippets。
Step 5. 选中代码模板要放到哪个文件中,比如放到 global 中。注意,Vscode 中这个文件的格式一定要满足 json 格式。
至此,代码模板就成功添加到了编辑器中,在刷题的时候,都可以用上它。
Step 6. 输入我们的模板关键字,再回车,一份完整的并查集模板代码就可以直接使用了。
注意:不要小看添加模板和使用模板的小妙招。我曾经用这个绝招,10 个小时刷完了所有的二叉树的题目!
我们是在学习算法,不是在练习打字。所以一些固定的代码模板,没有必要重复地敲来敲去,以及浪费时间在一些低级的 Bug 调试。
阶段 2:一题多解
这一阶段是以解题为核心,你需要回顾一遍刷过的题,这里我给你划了有三个重点:
- 每个题尽量需要做到有多种解法;
- 找到不同的题目之间的联系、差异、变化规律;
- 重点关照没思路的题、经常写错的题、有多种解法的题。
这一阶段的产出就 3 个字——有思路。具体来说,就是看到题目能够辨别出题目的考点,能够联想到我们的算法与数据结构,然后快速想到解题思路。
注意:这一阶段不是去突击困难的题,而是要保证拿到中等难度的题要有思路。
所以你在刷题的时候,要快速利用你之前整理好的代码模板。比如我会将阶段 1 整理好的代码模板放到 Vscode 编辑器中。写题的时候就可以一键写好我的代码。刷题速度快到飞起!
面试准备
如果你的目标是面试,那么在面试前,就只需要做两件事:
- 复习整理好的代码模板,把这些代码模板写熟练,能背着打出来最好;
- 复习不容易形成思路的题目,利用碎片化时间不停抽查这些题目。
准备面试阶段,我们在写题时,一定要计时!人为加一点心理压力,对面试有非常好的帮助。
超越自我
如果你还想更进一步提升自己的能力,那么可以跳出舒适区,积极地参加一些算法竞赛。与更多的选手、大佬们交流,并且积极地写题解帮助更多的朋友。有时候,“以赛代练” 能够更加有效地提升你的算法能力。你需要做到:
- 不要在意排名
- 比赛做不出来没关系,赛后一定要补题
- 写题解
- 看别人的题解
有了以上几步,相信你的算法能力会迅速提高。
执行力
以上就是我针对自身情况,以及分享给我身边的朋友们的学习方法。至少就突破面试而言,已经够用了。
不过,算法是一门实践性非常强的学科。当你有了这么一份好的计划,那么接下来你要做的事情就是:执行它!坚决地执行它!
总结
这就是我学习算法的过程与方法。看到这里,希望你能够根据这个方法制定出适合自己的方法和计划,并且一定要执行到位。
如果你有什么更好的方法、建议,欢迎写在留言区,我们一起讨论。再见。