联系我

算法学习路线指南

2020.08.29

初入门径

如果你刚开始接触编程,在学完一门编程语言的基本语法之后不知道接下来该学什么,这时候你就可以开始练习编程题,这样做有以下几点好处:

  • 实践编程语言的语法;
  • 熟悉开发工具的使用;
  • 练习编码、调试等技巧;
  • 编程题可以在一定的时间内求解,很快就能让你体验到编程带来的成就感。

Leetcode 上有大量的编程题,可以先按照 Acceptance 逆序来练习。之后再按 Tag,哪个类别没掌握好就练习相应 Tag 的题目。

在练习了一定量题目的时候,会碰到算法相关题目,这时候就该学习数据结构和算法知识。可以看一些豆瓣评分较高的算法书籍,也可以看一些评分较好的网课,Coursera和慕课网上都有一些不错的课程。

你可能会觉得你才刚入门,学习数据结构和算法难度会很大。其实数据结构和算法是编程中很重要的一部分,如果没有这些知识的话,在编程时会经常不知道要怎么去实现一个很简单的功能。而且数据结构和算法也是其它技术的实现基础,要理解这些技术的实现原理就必须学习数据结构和算法。所以,越早学越好。

很多人都在说,工作中基本用不到数据结构和算法知识,学不学无所谓。如果每天都是在写业务代码的话,那确实不怎么需要这些知识。但是如果你对自己有更高的要求,希望能多学习一些技术来保持自己的竞争力的话,那么数据结构和算法知识对你来说就非常重要。

应对校招要准备多充分

算法知识在校招中基本可以排在第一重要的位置,国内互联网公司越来越喜欢考察算法知识,无论在笔试还是面试环节。但是算法知识准备的时间周期很长,平均统计而言,要刷完400道左右的leetcode题目,大约需要半年时间,平均每天还得保证3到4个小时的刷题时间。看到这里相信很多人会觉得时间不够了,但其实你打一点折扣,也能够把算法知识准备得差不多。

刷Leetcode 200 题就足够应对大多数互联网公司的校招,但是如果时间不够的话刷 100 题也是有很大的收益,可以刷一下 Top 100 Liked Questions。

当然校招对算法的要求不仅仅体现在编程题,也要求分析常见的算法。学习这些内容比较好的资料推荐《算法》书籍,如果想在短时间内掌握的话,书中的证明、以及一些深入扩展性内容可以先跳过不看。比较重要的内容有以下这些:

  • 排序:大部分要求能手写,并分析时间空间复杂度,以及稳定性
  • 树:红黑树的原理以及在 JDK 的使用;B+ 树以及在数据库索引中的使用
  • 图:拓扑排序;并查集;最短路径;最小生成树
  • 散列表:实现原理,以及在 JDK 中的使用
  • 字符串:KMP;AC 自动机;Trie 树

剑指 Offer 与 Leetcode

除了刷 Leetcode,很多人也会选择刷 剑指 Offer。剑指 Offer 可以看成是 Leetcode 的精简版,国内互联网公司的很多算法面试题会直接从剑指 Offer 上面出。但不推荐刚开始的时候就刷剑指 Offer,因为它没有很好的 Acceptance 和 Tag 功能,答案质量也没有 Leetcode 上面的高。而且剑指 Offer 有很多题目其实选的并不好,也有很多内容没有覆盖到,比如背包、Trie、并查集、网络流等。

当然不能否认它的价值,如果你的准备时间非常短,而且有一定的算法基础,那么很建议直接刷剑指 Offer。

Leetcode 刷题方法

在刚开始刷 Leetcode 时,很多人只有在看完答案才知道要怎么做,如果不看答案的话完全没有思路。这是非常正常的现象,并不表示你的思维能力比别人差。人类最擅长的学习方式是模仿,刚开始刷题的时候不会做看看别人怎么做是很正确的做法,模仿多了自然就会做了。

刷 Leetcode 也有两种流派:龟派和兔派。龟派每道题都要想很久,而且尽可能想出多种解法。兔派是想一会儿就看答案,这样就可以很快地刷题。龟派比较适合思维锻炼,而兔派比较适合短期内快速提高并记忆。如果是为了应对校招的话,比较推荐兔派这种刷题方法,因为校招确实很依赖于短期记忆。选择兔派这种方式的话,就需要反复地进行复习,从而保持记忆并增加理解。但是也不能完全采用兔派这种方法,因为如果习惯于不去思考怎么做的话,会养成惰性的思维方式。

当你刷题到一定程度的时候,最好每天再刷一两题保持题感。可以选你之前做过的题目,因为你再做一遍的话可以很快做出来,这样子就可以让你对刷题这件事保持积极的一种心态。

笔试算法题

Leetcode 和剑指 Offer 的题目都偏向于面试算法题,在面试中通常要求五到十分钟做出来,但是笔试算法题安排的时间通常要半个小时到一个小时,所以难度会大一些。笔试算法题的内容比较灵活,很多会给很长一段场景描述,这就需要先理解这个题目的意思,再选择合适的数据结构和算法进行解决。

还是可以通过刷 Leetcode 来准备笔试算法题,但是要找一些笔试真题来练练手熟悉一下。如果时间非常充足,而且目标是大厂的话,推荐再简单准备一些 ACM 的题目,可以看看《挑战程序设计竞赛》。不过如果时间不是很够的话,就不要花太多时间在刷笔试算法题上,因为即使笔试成绩不理想,但是你有出色的简历的话,也会有面试官捞你参加面试。