知识点
时间 / 空间复杂度分析
数据结构
- 数组
- 字符串
- 队列
- 栈
- 链表
- 集合
- 哈希表
- 树
- 二叉树
- 多叉树
- 字典树
算法
- 排序
- 双指针
- 查找
- 分治
- 动态规划
- 递归
- 回溯
- 贪心
- 位运算
- DFS
- BFS
- 图
像面试无非就那么几个重点:树、动态规划、深度 / 广度优先搜索、链表、数组、排序、栈、队列、哈希、字符串等。
刷题方法
1. 刷题顺序
刚开始刷题,从 Leetcode 刷起,如果觉得难,那就可以试一试《剑指offer》,刷完这个再刷 Leetcode,这样效率更高。
记住三个要点:从【学习板块 LeetBook】刷起,从【简单的】刷起,从【通过率高】的刷起!
先完成专项练习中一些简单的题目,理解其背后的算法和数据结构。
之后,再举一反三,练习更多相关的题目。
当你能做到用同一个算法解决一类共性问题,做到 多题一解 时,才算是真正理解了。
如果是新手刷题的话,推荐先从「简单」难度等级的算法题开始刷题。
等简单题上手熟练之后,再开始按照标签类别,刷中等难度的题。
中等难度的题刷差不多之后,可以考虑刷面试题或者难题。
其实 LeetCode 官方网站上就有整理好的题目不错的刷题清单。链接为:https://leetcode.cn/leetbook/。可以先刷这里边的题目卡片。
我这里也做了一个整理。推荐刷题顺序和目录如下:1. 初级算法 2. 数组类算法 3. 数组和字符串 4. 链表类算法 5. 哈希表 6. 队列 & 栈 7. 二分查找 9. 二叉树 10. 中级算法 11. 高级算法 12. 算法面试题汇总我之前刷过的 LeetBook 清单:
或者:数组-> 链表-> 哈希表->字符串->栈->队列->树->回溯->贪心->动态规划->图
当然还可以通过官方新推出的「学习计划 - 力扣」按计划每天刷题。
刷完 Leetbook 专栏后,进入题库,利用 LeetCode 自带的题目筛选和排序功能,能够帮助我们由简单到中等再到困难,渐进式刷题。一般来说,先刷通过率较高的题目,相对比较容易。
注意:一定要把自己做过的每道题目代码都自行保存好,定期复习。
2. 利用题解
既要理解作者做题的思路和逻辑,也要细致入微地学习他人代码中优秀的写法。学习更多他人解题的思路,帮助自己打开脑洞,做到 一题多解。
除了 LeetCode 自带的题解之外,网上有很多其他大佬整理的算法题解,比如全网疯传的谷歌大佬算法刷题笔记(C++ 语言)。
现在网上的题解实在是太多啦!在刷题时,读个一两份就行了,别给自己太大压力。
关于题解,霜神建议这样使用:
- 先自己读题,思考如何解题。如果 15 分钟还没有思路,那么先看笔者的解题思路,但是不要看代码。
- 有思路以后自己用代码实现一遍。
- 如果完全不会写,那就看笔者提供的代码,找出自己到底哪里不会写,找出问题记下来,这就是自己要弥补的知识漏洞。
- 如果自己实现出来了,提交以后有错误,自己先 debug。
- AC 以后没有到 100% 也先自己思考如何优化。如果每道题自己都能优化到 100% 了,那么一段时间以后进步会很大。
- 所以总的来说,实在没思路,看解题思路;实在优化不到 100%,看看代码。
3. 精益求精
虽然答出题目就已经很棒了,但还不够。
面试的时候,一些面试官就喜欢给你出题目的变种,或者要求你用更优的方式解出题目。
所以,在保证完全理解题目解法的基础上,请不断优化你的代码,找到更多的思路和更优解,直到击败 100% 的用户。
请认真对待每一道算法题目,把它当成一个工程问题来解决,相信你的思维会逐渐打开,并逐渐掌握编写高性能程序的技巧。
4. 自己写题解
除了看题解外,很多同学没有意识到,多写题解,才是真正的法宝,把自己的解题思路整理成文,或者讲给别人听。
甚至有一些厉害的同学通过记录和分享自己的题解,还没毕业,就已经出版了自己的书籍,年入几十万或者百万!
刷算法题,有一个十分有用的技巧,就是「写解题报告」。
如果你刷完一道题,能把这道题的解题步骤、做题思路用通俗易懂的话写成解题报告,那么这道题就算是掌握了。
这其实就相当于「费曼学习法」的思维。
这样,也可以减少刷题的遍数。
如果在写题的时候遇到之前刷过的题,但一时之间没有思路的,就可以看看自己之前的解题报告。这样就节省了大量重复刷题的时间。
5. 参与竞赛
LeetCode、牛客等网站每周都会开展一次线上算法竞赛,看看谁能在有限时间内最快最多地解题。
在竞赛的过程中,紧张刺激的环境会使我们的精神保持高度集中,能够激发出我们的思维,从而在有限的时间内进行更多的思考,也能帮助我们适应面试的节奏。
参加蓝桥杯竞赛也是不错的,我自己也参加了两届,题目的难度和找工作要求的算法题目难度相当,也能发现自身的不足、激励自己进步吧。
6. 考取证书
这几年,PAT 计算机程序设计能力考试在逐渐升温,分为顶级、甲级、乙级三个级别。
我亲身参与过甲级和乙级的考试,难度适中,虽然目前这个证书的含金量不高,但在备战考证的过程中,你有一个学习的目标,会更有动力坚持下去。在我看来,过程大于结果。
刷题阶段
刷题大概可以分为 4 个阶段。
纯小白,不知道怎么刷题,对很多概念都很陌生,各种数据结构和知识点几乎完全不懂,打开 LeetCode 第一题,满头问号。
算法上基本已经入门,Easy 可以做出来,Medium 纠结半天也能有头绪,但基础不牢,比如字符转字符串还得 Google 一下。
刷了几百道题后,总结了自己的解题模板,参加周赛有时候甚至可以全部完成。
开始以 beat 100% 作为 AC 的目标了。
就目前的算法面试大环境来说,能达到第二阶段,中小公司可以应付过去了,到达第三阶段,字节、腾讯算法面试环节妥妥没问题了。
怎么样到达第三阶段?给一下我的一些小建议吧。
如果目标是国内大厂,那么一定要刷足够的题,不需要把 LeetCode 上 2500 道算法题都刷完,但**至少刷 200 道算法高频题**,这些高频题我都写了题解同时也录制了视频,在这个链接总结了:https://www.algomooc.com/1659.html
面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。
刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。
什么时候可以停止刷题?
至于什么时候可以停止刷题了呢?这也要看你刷题的目的,是找工作还是持续锻炼思维提升自己?
无论如何,刷题一定要养成习惯,像高考做卷子一样,每天最好固定一个黄金时间,坚持做几道题目,而不是急于求成、爆发式刷题!
根据我过去一年多和小伙伴们一起刷题打卡的经验发现:那些能够坚持每天刷题,并最终学会一整套「基础算法知识」和「基础数据结构知识」的人,总是少数人。
大部分人总会因为种种主观和客观原因而放弃了刷题(工作繁忙、学习任务繁重、个人精力有限、时间不足等)。但不管怎么样,如果你当初选择了学习算法知识,选择了通过刷题来通过面试,以便获取更好的工作岗位。那我希望在达成自己的目标之前,可以一直坚持下去,去「刻意练习」。在刷题的过程中收获知识,通过刷题得到满足感,从而把刷题变成兴趣。希望大家能够一起坚持刷题,争取早日实现自己的目标。
资源
1. 经典面试题
- LeetCode 精选 100 道:https://leetcode-cn.com/problem-list/2cktkvj/
- LeetCode 精选算法 200 题:https://leetcode-cn.com/problem-list/qg88wci/
2. 书籍推荐
刚才我说了很多种题型,对于按题型刷题总结,首推《程序员代码面试指南:IT名企算法与数据结构题目最优解》,这本书真的挺不错,大部分题型都总结了,而且每个专题有十几二十道,这里建议大家买本来学习。
还要一本我大一看的,感觉也挺不错,叫做《挑战程序设计大赛》,不过这本比较适合不急着面试的吧,这本不像上面那一本,专门来总结各种题型应付面试。
《编程之美》、《编程珠玑》也建议看,这两本我觉得比较有趣,不是说让你一直刷题一直刷题,这两本你可以买来看看,会给你带来一些思路,这两本我是只看,没动手打代码。
Leetcode 刷题的时候,也是可以分题型刷滴,所以也可以去 leetcode 刷题,不过刷题的时候,我这里有个建议,就是别在本地 IDE 写代码,直接在网页端写就行了。因为面试的时候,一般就让你在记事本写代码,不会给你 IDE。如果你不习惯,估计很容易写错代码,而且,有些库函数你也把名字忘记了。网页端其实也是挺方便的,也会有一些代码提示。
- 图解算法数据结构:https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/
- LeetCode 101(C++):https://github.com/changgyhub/leetcode_101
- LeetCode 题解(C++):https://github.com/soulmachine/leetcode
3. 视频
- 尚硅谷 Java 数据结构与算法:https://www.bilibili.com/video/BV1E4411H73v (难度比面试的要求大一些,适合希望更全面学习的朋友)
- Leetcode 真题解析:https://www.bilibili.com/video/BV1a54y1b74k
4. 工具
- VisuAlgo 数据结构和算法动态可视化:https://visualgo.net/zh
- 数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
- RegExr:https://www.code-nav.cn/rd/?rid=79550af2601114e9012110711798772b (学习、创建和测试正则表达式的在线可视化工具)
5. 网站
- 五分钟学算法:https://www.cxyxiaowu.com/
参考:
刷了 1000 多道算法题,一点心得(鱼皮原创)
leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
霜神
力扣(LeetCode)
吴师兄学算法