从入门到修仙的算法之路

算法的重要性(Why)

首先强调一下为啥要刷题,刷题的意义何在,只有知道了一件事的有多重要的意义,才能重视起来,进而采取行动,把它去搞好。

面试中都会考什么呢?/我怎么样才能拿到一个不错的offer?

问过我这个问题的,我经常会这么回答大家:面试中会考察基础/项目(准备几个亮点)/《剑指offer》,这里校招和社招区别就是社招问的项目多一些。

基础

操作系统,数据库,计算机网络,编程语言这些,这些知识都是平时学习,记住了,理解了,不忘记就可以了,面试官问我们,可以说清楚咋回事就行,重在理解,切记死记硬背

项目

项目或者经历是平时准备的,如果马上面试了再去准备也是很难的,作假在面试中会直接被面试官看穿,所以这个平时就要准备好,如果是校招,那平时就要做一做有用的项目(这里推荐一下牛客网叶神的项目),准备一两个项目亮点,看看这篇文章:可以作为你面试的项目亮点的文章,不来看看吗?,如果是社招,平时在工作中就要用心做。

算法

算法和数据结构,是真的需要好好写代码才能掌握,不是说看了理解了就真正会的了,大家每天看我的题解知道了这个题的思路,也就是说是在看了理解了这个层面,而这种程度距离自己写出来还是有一定差距,你不自己去实现一下,你就不知道这道题有多难,提高算法能力一定要动手!!!提高算法能力一定要动手!!!提高算法能力一定要动手!!!。
从这个问题中可以看到,拿到offer分为三个方面基础/项目/算法,算法就占了一个方面呢!重不重要?

再拿我现身说法吧,之前美团的面试,我的基础和项目回答的都很好,一面和二面面试官都对我赞赏有加,然后三面当时给我出了一个动态规划的题目,我在那想了半个点,最后面试官说你出去等通知吧,也就是说面试挂了,具体详情看我这篇文章,美团超详细面经(附答案)。

总之,就是很重要

算法学习内容(What)

学什么?我在这里的话建议大家先学一些编程必须要会的基本功,然后去做题,这样你就知道你学到这些东西可以做出一些题目(把题目AC了),然后你就会有成就感,有了成就感,遇到更难的题目你就会自发的去学习更多的知识,这种自我激励机制我认为很重要。

第0步:

1掌握java的if/else/for/while这些语句的使用,会用条件判断,以及会使用循环
2掌握数组,以及直到引用和传值的区别(int [] a a数组就是引用,去替体会引用的妙处,这里如果有C语言基础,那么就相当于C的指针)
3然后是了解/使用java中在解题中经常会用的集合ArrayList/hashset/hashmap/treeset/treemap(要理解什么时候用这些东西,比如存不重复的数据那么第一时间相等hashset,比如存的数据还要有序,那么相等treeset,可以编程少写很多代码)这些可以先不搞懂底层原理,会调用api就行。
4了解如何计算最坏情况,最佳情况,平均时间复杂性度
以上必须掌握,以上掌握就可以做一些不涉及数据结构知识的题目。

数据结构的知识

步骤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

猜你喜欢

转载自blog.csdn.net/AthlenaA/article/details/84503876