大家都是如何刷 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分钟
本文地址:https://blog.csdn.net/JiuZhang_ninechapter/article/details/107388730