大家都是如何刷 LeetCode 的?

367 阅读3分钟

说一个工科转CS同学的例子,毕业后刷题3个月拿到Facebook,Google,Amazon全职offer。

这是他在3个月刷题过程中做的笔记,将近900页,你们感受下

mnmunknown.gitbooks.io/algorithm-n…

大家刷LC的目的一般很明确,就是为了找工作应付算法面试。

由于选拔性质的存在,面试中的算法题从问题的深度和广度上都会有其限制:不能太难,也不能太偏。

所以算法面试往往并不完全是看谁最聪明,而是看谁准备最充分。这是一个可以靠针对性训练与总结“hack”的机制。

回到刷题本身,不要寄太大希望于“速成”。一般要制定一个至少几个月的学习计划,根据自己当前的基础和水平做针对性训练。

算法题数量太多怎么办?

前面说的同学在刷题的时候,LC大概只有400-500道题,不到现在的1/3。想要全部刷完LC上的题目其实不太现实也没必要。

我见过刷题不到100道就能进谷歌的人,也见过刷了500题依旧过不了面试的人。所以不要把“题目数量”作为刷题指标。而应该把问题拆解,拆成具体的问题模式和对应的解决方法。大概像是这样:

每道算法题都有其构成的基本单位,比如属于数组、用到了某某算法等。通过将问题拆分,做类比分析思考,自行做“聚类操作”,我们就能构建自己的算法知识体系。这个过程做笔记是最有效的。

比如很多问题都可以转化成“Tree”或者“Graph”,或者“递归”

搜索问题基本是多叉树,有些问题就是以root为起点的“走迷宫”——DFS + Backtracking

有些在搜索/子问题树里,要按特定顺序进行处理——在二叉树里,我们叫它pre-order / in-order / post-order遍历

有些时候,树的结构与子问题重复性很高——于是有了记忆化搜索 / 动态规划

知其所以然,寻找知识的根节点

一个问题求解的思考过程,要比最终解法更重要。就好比数学/物理定理,你理解了会用是一种境界,能完整证明又是另一种境界。所以如果可能的话,尽量不要让自己陷入靠记忆解决问题的地步。

就拿动态规划来说,我们刚做动态规划题的时候往往都摸不着头脑,看了答案之后恍然大悟,原来是这样,只要找到状态转移方程,之后就简单了。

但这里的坑点也在这里,因为答案一般直接告诉你了状态转移方程,却不会说明是如何找到状态转移方程的。这个思考过程在刷题中其实是欠缺的,这也导致看起来懂了,其实并没懂,下次遇到动规题还是很大可能不会。

如何提高刷题熟练度和速度?

  • 直接在Online Judge上写,尽量靠眼睛debug,少用IDE;
  • 常用算法/模板结构集中多练习(quick select,BFS/DFS);
  • 多和朋友讨论,多做模拟面试;
  • 面试前花1-2周时间好好练习白板代码

最后提供一些我觉得不错的算法入门书籍和工具

  • Algorithms(红皮书,Princeton):适合入门,配合公开课一起看
  • 算法导论:不建议入门时看,适合作参考书,带着问题来看
  • VisuAlgo:算法可视化工具
  • LintCode等Online Judge算法题训练平台

另外,九章算法班新一期首节直播分享也快开始了,有关国内外大厂算法面试的各种问题,包括如何高效刷题、如何跟面试官正确沟通、如何提升代码质量和bug free能力等,都会在直播中分享,欢迎大家来参加~