从入门到修仙的算法之路
- 2019 年 10 月 4 日
- 筆記
前言
最近开展了每天一道leetcode/每天一道剑指offer的刷题活动,总有很多人问我,该如何刷题/零基础如何开始刷题,这里和大家分享一下我的经验。
算法的重要性(Why)
首先强调一下为啥要刷题,刷题的意义何在,只有知道了一件事的有多重要的意义,才能重视起来,进而采取行动,把它去搞好。
面试中都会考什么呢?/我怎么样才能拿到一个不错的offer?
问过我这个问题的,我经常会这么回答大家:面试中会考察基础/项目(准备几个亮点)/《剑指offer》,这里校招和社招区别就是社招问的项目多一些。
基础
- 操作系统,数据库,计算机网络,编程语言这些,这些知识都是平时学习,记住了,理解了,不忘记就可以了,面试官问我们,可以说清楚咋回事就行,重在理解,切记死记硬背
项目
- 项目或者经历是平时准备的,如果马上面试了再去准备也是很难的,作假在面试中会直接被面试官看穿,所以这个平时就要准备好,如果是校招,那平时就要做一做有用的项目(这里推荐一下牛客网叶神的项目),准备一两个项目亮点,看看这篇文章:可以作为你面试的项目亮点的文章,不来看看吗?,如果是社招,平时在工作中就要用心做。
算法
- 算法和数据结构,是真的需要好好写代码才能掌握,不是说看了理解了就真正会的了,大家每天看我的题解知道了这个题的思路,也就是说是在看了理解了这个层面,而这种程度距离自己写出来还是有一定差距,你不自己去实现一下,你就不知道这道题有多难,提高算法能力一定要动手!!!提高算法能力一定要动手!!!提高算法能力一定要动手!!!。
从这个问题中可以看到,拿到offer分为三个方面基础/项目/算法,算法就占了一个方面呢!重不重要?
再拿我现身说法吧,之前美团的面试,我的基础和项目回答的都很好,一面和二面面试官都对我赞赏有加,然后三面当时给我出了一个动态规划的题目,我在那想了半个点,最后面试官说你出去等通知吧,也就是说面试挂了,具体详情看我这篇文章,美团超详细面经(附答案)。
总之,就是很重要
算法学习内容(What)
学什么?我在这里的话建议大家先学一些编程必须要会的基本功,然后去做题,这样你就知道你学到这些东西可以做出一些题目(把题目AC了),然后你就会有成就感,有了成就感,遇到更难的题目你就会自发的去学习更多的知识,这种自我激励机制我认为很重要。
第0步:
- 打印你的第一行“hello world”;
- 掌握java的if/else/for/while这些语句的使用,会用条件判断,以及会使用循环
- 掌握数组,以及直到引用和传值的区别(int [] a a数组就是引用,去替体会引用的妙处,这里如果有C语言基础,那么就相当于C的指针)
- 然后是了解/使用java中在解题中经常会用的集合ArrayList/hashset/hashmap/treeset/treemap(要理解什么时候用这些东西,比如存不重复的数据那么第一时间相等hashset,比如存的数据还要有序,那么相等treeset,可以编程少写很多代码)这些可以先不搞懂底层原理,会调用api就行。
- 了解如何计算最坏情况,最佳情况,平均时间复杂性度
以上必须掌握,以上掌握就可以做一些不涉及数据结构知识的题目。
数据结构的知识
步骤1
- 单链表(在前面,后面,中间插入;在前面中间删除)
- 双链表
- 队列
- 栈
- 循环链表
- 二叉树(普通的二叉树得会三种遍历树的方法/构建二叉树/求树的高度/二叉树的深度搜索/二叉树的层次遍历也就是广度搜索)
- 二叉搜索树(理解二叉搜索树的性质,插入删除先不看,查找得会)
- 二叉平衡树(平衡树先了解概念,插入删除左旋右旋先不看)
- 堆(堆如果不懂,可以先不看)
- 哈希
必知必会,可以说是刷题必会的数据结构基基基基础了
步骤2
- 学习一些基本的排序算法及其用例和时间复杂度。
- 冒泡排序
- 插入排序
- 选择排序
- 归并排序
- 快速排序
- 。。。七大排序
- 二分查找
个人的刷题经验,掌握前两步大多数的《剑指offer》题目和leetcode的题目都可以刷了
第3步(进阶):
- 把之前跳过的搞懂
- 贪婪方法(Knapsack,Prim算法,Kruskal算法,Dijkstra,Bellmanford)
- 动态编程(0/1背包,旅行商问题,硬币更换)
- 回溯(N皇后问题)
- BFS
- DFS
- 搜索元素
- AVL树
- 。。。。
如何学习(How)
学习方法
学习编程的时候看书还是看视频,这是很多人的疑问。
我说一下我比较看好的方法:**视频 + 书,两者结合起来。
对于初学编程的人,小白一个,什么都不会,我是强烈建议看视频学习入门的,我觉得看视频,有老师带着能很好的理解一些概念,以及看着老师在视频里面敲代码(这里要说明一下,如果老师只是照着ppt在念,那么这个视频就不要看了,念ppt谁都会),有老师带你,可以帮助你培养对编程的兴趣,不至于那么难了,慢慢的就可以入门了。
当你入门了一会,那么你肯定需要系统的学习编程知识的时候了,此时,应该以看书去系统地学习为主,视频中是不会给你扣的那么细的(太细,培训班的课程上不完了),所有你就必须看书,深入理解并且结合实战敲代码,把这些巩固起来。
这里说一我的经验,比如你刷题,出问题了,千万不要死盯着看,要把纸和笔拿出来去举个例子比划一下,你一下就知道是咋回事了,不是天才的我们是没法一下子写出AC的代码,自己要学会演示代码,找出bug所在;还有一个常用的方法就是把中间的结果打印出来。
资料推荐
资料推荐结合前面的What篇
- What篇的第0步对应的基础知识可以去看毕向东(B站),如果只是为了快速上手刷题,那么跳过和我列无关的内容,掌握需要刷题的语法/集合的使用即可。
数据结构推荐
What篇的第1步和第2步,我强烈推荐一个在线网址(可能需要科学上网,大家先试一试能打开不)
- https://visualgo.net/zh 里面对排序/链表/队列/二叉树/图等等,所有的内容都有一个详细的动画过程,非常方便你理解。(示例如下图)

上图示图形演示,下图是对应代码演示。(谁用谁知道)

- 视频课程的话推荐 浙江大学的mooc 这个口碑不错 https://www.icourse163.org/course/zju0901-93001 如果你有C语言基础,那么可以看看郝斌的数据结构教程。 数据结构: https://pan.baidu.com/s/1qQrHTdkvxMLSGv7G4nHWBw 密码:4o9p
- 书籍的话推荐《大话数据结构》
算法推荐
- 视频:牛客网算法视频
- 书籍:《图解算法》 《啊哈算法》这两本入门,《程序员代码面试指南:IT名企算法与数据结构题目最优解 左程云著》,《剑指offer》这两本用来进阶面试。
七大排序算法推荐
- 这里推荐我看过的两个很优秀的博客。 https://blog.csdn.net/morewindows/article/details/6684558 https://blog.csdn.net/whuslei/article/details/6442755
刷题网站
- leetcode
- 牛客网对应专题
成神/修仙之路
这里列几个我看过的大神的推荐算法学习路线(建议都看看,花不了多长时间,磨刀不误砍柴工,不要着急去干其他事情,多看看大神是怎么干的,可以帮你少走很多弯路)。
- july大神 CSDN博客阅读量前100名 https://blog.csdn.net/v_JULY_v/article/details/19131887
- 牛客网左神 https://www.nowcoder.com/discuss/61529
- 斩获BAToffer手撕红黑树的剑谱兄 http://t.cn/ELbVOZ7
结束语
编程没有捷径,就是多看多练多想,时间上去了,能力也就上去了。这么用心,请我吃包辣条吧~