>点击上方“Java Dev”关注<
看看你有多少好友也关注了我
Photo From Internet
说起学习算法,相信每个程序员都有一段故事,有的人可能是痛苦的,有的人可能是快乐的,也有的人可能是平平淡淡的,今天就和大家一起来聊聊我的算法学习之路。
首次接触算法是在读大一的时候,计算机的专业的同学想必都会在大一的时候学习一门课叫做 “C 语言程序设计”。这本书里面的某一章节中介绍了冒泡排序算法,这是我接触的第一个算法,然而大一这一年我连 C 语言都没有学好,就更别说算法了。
第二次接触算法的时候已经读大二了,那时候开了一门课程叫做 “数据结构”,当时采用的一本教材是清华大学出版社出版的《数据结构(C 语言版)》,作者是严蔚敏老师,书名可能大家不记得了,但是看到下面这个闪耀的封面,是不是一下子又把你拉回了那个青涩的年代。
这本书虽然主要讲解各种数据结构,但是也涉及到了一些的算法,例如排序、树的遍历、图的遍历等等。还清楚的记得当年期末数据结构考试的时候考了 95 分,你以为我数据结构学的很棒了吗?然而并没有,注意到前面的书名了吗?这本教材采用 C 语言描述,大学才开始接触编程的我一直处于懵逼状态,虽然大一学了 C 语言,但是根本没有学通,只会写写 Hello World,结构体指针什么的都没有弄明白。
之所以能考到 95 分是因为试卷里面大多数是选择填空题(唉,可能学校为了控制及格率吧),小老哥我虽然 show 不了 code 只能 talk ,到最后也拿了个不错的成绩,毕竟最后一周老师划了考试重点,由此可见学习重点知识的重要性,哈哈。
就这样数据结构混完了,转眼到了数据结构的短学期实战课,show 不了 code 我最后只能缴械投降了,到此我掌握了大量的数据结构概念,但是一到写代码就懵逼,就这样与算法的第二次约会结束了。
转眼间就大三下了,学校里开了门专门的算法课,作为一个标准的学渣当然不知道这门课的重要性,虽然此时我已经成为了一名标准的 CRUD Boy ,熟练的掌握了 J2SE 和 J2EE (老程序员应该对这个称呼很熟悉,现在一般叫 Java SE、Java EE),但是我依然稀里糊涂的上完了这门课,各种算法套路左耳朵进右耳朵出,与算法的第三次约会又悄悄的结束了。
很快的就毕业参加工作了,整天 CRUD。慢慢的 CRUD Boy 的烦恼诞生了,觉得技术达到了瓶颈,开始向项目组的技术大佬开始请教,寻求找到方向。经过大佬的指点迷津,我决定开始学学算法,把基本功打扎实。大佬对我说了什么,基本呢和我在上一篇文章《 面试了一个月,到底要不要刷算法?我有了答案 》提到思路一致 ,还不知道为什么要学算法的小伙伴可以过去洗洗脑。于是我兴冲冲的跑去买了如下一本书:
好吧,结果不用我多说了,从入门到放弃没有超过一个月,我老老实实的继续去做 CRUD Boy 了,这算是我与算法的第四次约会吧。
经历了前面的几次的惨败,接下来就是与算法的第五次约会啦。基本还算成功,通过层层关卡,最终拿到了满意的offer,这一次我与算法之间发生了什么?为了战胜算法小怪兽,我制定了一个周密的打怪升级计划。
通过我的辛酸算法学习经历你应该也发现了,前三次都是处于一个懵逼的状态,完全没有明白学习算法的意义,没有清晰的目标。第四次虽然明白了学习算法的意义,但是由于战略的错误,导致虎头蛇尾,很快就败下阵来。相信看到此处的你已经有了明确的目的,如果你还是不明白,那就去翻翻《 面试了一个月,到底要不要刷算法?我有了答案 》。
明确了学习算法的意义以后,接下来就是设置一个目标啦,有了目标你才会学习的更加有动力。第五次我学习算法的目标就是让面试中碰到算法时不再愁眉苦脸,面红耳赤,就是这么俗气简单。当然啦,这个目标还是有点大,还要再一步细分,数据结构与算法知识繁杂,具体看看下面这张图:
但是真正面试中考察到的其实都比较经典的常见的一些算法和数据结构,所以想要攻克面试中算法只需要掌握一些核心经典的算法和数据结构就差不多了,如下是我整理的一些常见的算法数据结构:
怎么样,是不是精简了许多呢?所以,不要被繁杂的知识吓到,要善于去提炼重点知识,集中精力突破。
学习目标制定了好了以后就是不断去学习实践咯,想必热爱学习的你一定听说过 10000 小时定律。学习算法也是一样的,不能光学理论知识,而忽略了代码实践,不然很可能会造成像我的第 2 次经历一样,光掌握了一堆概念理论,一遇到写代码就懵逼,要知道现在面试过程中可都是要白板手撕代码的哦。
在我 5 次战斗中,我采用了 LeetCode 来实战演练算法,每学习完一个数据结构或者算法,我就会去 LeetCode 中找到相关标签下面的题目都做一下。做的过程中难免遇到百思不得其解的题目,如果花费了一半个小时候你还没有思路,我建议你去看看答案。说到答案呢,我推荐一个 Chrome 刷题插件 “九章刷题小助手”,刷题小助手里面有所有 LeetCode 算法题目的答案,而且答案有多种语言的解法,Java、Python、C++,同时也给出了多种解题思路。
当然啦,如果你能找到几个志同道合的小伙伴一起刷题是最好的,遇到不会的题目可以一起讨论,做完题目以后交流思路,这样学习起来会更有效,也更快乐。同时当你想要放弃的时候也有小伙伴可以监督你。
做完题很重要的一个过程是总结,像我在第五次学习的时候就和几个小伙伴一起,创建了一个刷题微信群,每天下班一起做一道题,做完后交流思路和答案,总结题型解法,就像高考做试题一样将题目归类,下次出现同类型的题目直接破解。
开始行动了以后也要注意学习阶梯,每天做难题的话信心容易受到打击,所以最好的方式是让做题能像打游戏上瘾一样有趣。如果我们做题也有一个递进关系,从简单到复杂,每天学习要有 20% 是容易学习的旧知识,这样容易建立起自信心。每天信心满满,遇到特别难题可以先放下来等后面再倒过来学习可能就会变得简单了。
以上就是我与算法的故事了,你是不是也和我一样有一个辛酸的算法学习过程呢。
来吧,大声说出来,让我们一起笑一笑,哈哈。
往期精彩
面试了一个月,到底要不要刷算法?我有了答案
1 分钟看穿零拷贝技术,看不懂你打我
为什么 Java 程序员必须要懂类加载机制?
高级 Java 面试必问的三大 IO 模型,你 get 了吗?
细嚼慢咽 Java 线程池,你品你细品
分享一道美团一面的面试题,简单又细腻
final 这道送分题,你答对了吗?
面试官问我 volatile 是否存在伪共享问题?我懵逼了
Java 垃圾回收器很难?是你学的方法不对
当我们在谈论内存时,我们在谈论什么
聊聊 Java 的几把 JVM 级锁
感谢你的阅读,我为你准备了一份《高级 Java 面试指南》。
获取方式:点击在看,关注公众号,回复 "礼物" 获取。