大家都是如何刷 LeetCode 的?

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

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

https://mnmunknown.gitbooks.io/algorithm-notes/content/

大家刷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能力等,都会分享~

本周六还有系统设计免费讲座噢~

2小时带你设计高频系统设计面试题——秒杀系统,全面解析高并发常见问题。
戳我免费报名

内容介绍:

通过秒杀系统和订票系统了解如下内容:

  • 高并发场景下引发的常见问题
  • 了解数据一致性
  • 什么是动静分离
  • 读写分离如何实现
  • 如何防止超卖

讲师介绍

南帝——阿里在职P7+,14年+软件开发经验,10年+架构设计经验,擅长系统整体架构方案设计,面试过超过100+候选人,拥有多年资深面试官经验。

讲座时间: 2020/7/18 本周六 上午9:30:00

课程时长: 120分钟

猜你喜欢

转载自blog.csdn.net/JiuZhang_ninechapter/article/details/107388730
今日推荐