每一个时代,都不会亏待会学习的人。程序员
你们好,我是 yes。面试
我持续在 LeetCode 刷算法题将近有一年半的时间了,这一年半以来我对算法的见解改变了不少,可是实话实说支持我前进的仍是面试。算法
在以前的文章提到过我是面试驱动型选手,我享受面试官问我啥我都嘴角一翘微微一笑的那种不羁,而近年来算法在面试中的比重愈来愈大,因此我花了很大的精力去攻克算法这道难关,确实有点难。后端
我不是天赋型选手,甚至以为本身有点蠢,在刷题的过程当中常常被各类打击,最夸张的就是同一道题刷了 4 次,过一段时间去写仍是不会,从下面的这些草稿能够看出我当时心里的那种崩溃。数组
固然还有给本身加油打气的(不要嫌弃个人字丑哈)。缓存
通过了三本书的系统学习、一年半的刷题,三篇专栏的屡次学习,搞了不少大厂的真题练习,基本上有点稳了。数据结构
这篇文章想分享一下我面向面试学习算法的一些心得,因此算法大牛、算法爱好者能够关闭这个页面了,这是一篇面向通常程序员的算法面试攻略。数据结构和算法
在去年我还参加一个话题回答,「数据结构与算法的学习中,面对经典代码是选择本身实现仍是背诵?」,一不当心就被选上中奖了,嘿嘿。原本还想把奖品搞个抽奖送出去的,可是这个包装被我扔了,由于两张算法大地图须要长筒来装,很差运输,以后再看看吧。ide
来看看我是怎么回答这个问题的吧。学习
我以为学习算法就是理解+持续练习+刻意的背诵(有选择性的背诵)。
有些人学习算法多是兴趣爱好啥的,很直白的说我就是功利性的学习,而且可以由于功利心而持续学习。
由于功利我想快速获得收益的最大化,可是欲速则不达,所以我会在功利的状况下理性的学习算法。
一、首先巩固基础,万丈高楼平地起。算法就是使用各类数据结构按照必定的流程运行,管你五花八门稀奇古怪的算法题都逃脱不了数组和链表。在数组和链表之上特殊功能化了不少有特殊意义的数据结构:队列,栈等。
数据结构都是由于不一样的场景有不一样的需求而演化而来,所以在某个场景数组更合适,某个场景链表更合适,你所须要知道的就是它们分别的优缺点和使用的场景,并能知其然而知其因此然。
例如数组下标访问高效,是由于内存连续,所以对 CPU 缓存亲和性更高等。这样使用才能游刃有余,有的放矢。
二、持续练习,光说不练假把式,单单看是没用的,不上手便成空。
我没那算法的天赋,在我认为我对基本数据结构有了必定的了解的状况下,看到有些算法题仍是蒙圈,没那思路,脑壳空空,那也只能练呗。
遇到彻底没思路的题目最多 5 分钟我就会去找题解,有可能 2 分钟,由于功利嘛,还有一部分我以为我没那脑子我认清本身哈哈哈。
可是在找题解的时候我是秉着一个必须充分理解的目的去的,不理解不放弃,开玩笑答案至少我仍是得看懂吧(这句话我如今收回,当时仍是太年轻)。
固然这里的不放弃不是指这半天或者一天内必定要搞定。有时候就会陷入瓶颈,隔一天,或者去玩一下回来就会豁然开朗。
经过持续的练习,你脑子里就会渐渐的了解这些题目的套路,你也能更好的关联各类数据结构,这就是感受来了,你会发现本身变聪明了,这就是要进入良性循环了,而且持续的练习,你会发现某一天若是你没写算法题的时候会有一种罪恶感!
还有我不会借助 IDE 写,就在 LeetCode 上直接写,一个一个本身敲,时刻为着之后面试写题做准备,没错就是这么功利。
三、刻意的背诵(有选择性的背诵)
有人会说算法是要理解的,死记硬背是没用的。没错理解是确定要理解的,死记硬背确定过两天就会忘了。
可是我认为单单理解仍是不够的,理解+练习是可让你作出题目,可是作不到让你不假思索的作出题目,在面试的这种紧张的状况下,只有相似肌肉记忆才能给面试官最强烈的打击,稍微的紧张可能就会致使连环出错,满盘皆输!
所以对于那些经典的代码,经常使用的例如二分查找,快排等我都会刻意的背诵,达到听到二分查找,脑子里就有那么些代码出现的程度,没错我仍是这么的功利。
也就是说平时刷的算法题都要理解,可是一些经典的代码我认为理解还不够,须要背诵造成肌肉记忆。
有些人可能会以为,没啥好背的啊,多多练习就会了,额其实多多练习就等于背,是吧你说你写个十几遍不就等于背么。只是我是刻意的背。
啧啧,我以为我说的真好,哈哈哈。
再补充一下这个回答的个别观点:
一、掌握好基础,也就是那些经常使用的数据结构和算法,好比队列、栈、堆、归排、快排、二分、动态规划等等,熟悉这些经典数据结构和算法,通透的得知他们的适用场景。
解题无非就是将它们套上去,绝对不会叫你创新,你所作的就是套模板,就看你模板选的对不对,套的熟不熟罢了。
二、持续练习,这玩意是最重要的。由于叫不少人看东西没问题,让他上手就会有拖延症,感受有点麻烦。
可是算法就是得练,没有什么其余选择,不用耍啥小聪明,除非你过目不忘。
由于它的解题思路不太符合正常人的思考,因此你须要持续的练习,让你的思惟转变过来,造成看到这类的题目就会有应激反应。
还有两点很关键,我强调一下:
不要花太多时间在一道题上,几分钟没思路就看题解,看了题解再进行理解和默写。
不要用 IDE 写,面试的时候就是没联想提示的,有时候甚至是手写,因此在平时就要作好准备,不打无准备之仗。
上面其实讲的就是平日学习和刷题的套路,接下来说讲如何上手。
我选择小争哥的《数据结构与算法之美》专栏,这个专栏我刷了两遍,虽然说我还看了别的专栏,可是这个够了,上手绝佳,贴个专栏的图吧。几乎涵盖了全部的数据结构和算法书籍涉及到的知识点。
我就是看这个入门的,基本的套路讲解的很全,推荐先把专栏全面的看一遍,把每节课涉及的到代码本身敲一遍。
能够按如下学习顺序、难易程度和重点程度来学习这个专栏。
而后再二刷,二刷的目的是提炼和总结,我来贴一下我以前的个别章节总结,这是以前参加算法打卡活动留下的。
刷完以后,一些经典数据结构和算法至少都认识,也说得上来,基本上算是入门了。
而后再去看《算法(第4版)》这本书,虽然说我看了三本算法书可是我以为这本够了。
通常而言你们都会先推荐书,毕竟书都比较全也更加系统,可是我喜欢反其道而行之。
由于书太厚了,厚就容易劝退,特别是在你对一个领域不太熟悉的时候。
因此我更喜欢先去学别人提炼过的付费专栏,提炼出来的都是重点,让我对核心知识脉络有了充分的认识以后,再去看书来查漏补缺,创建完善的体系。
由于在你已经了解大体核心知识点后,你再去看大头书就会有一种熟悉感和共鸣感,这种感受可让你把书从头看到尾。
至于为何看了专栏以后还得看书,是由于专栏毕竟是被人提炼过的,而书的知识点大多都是完整的,你先吸取别人提炼过的知识点,带着别人的想法再去系统的学习,从其中再糅合出本身的总结,这样东西才真的是你的。
系统的学习完这本书以后,感受本身好像很厉害了?
并非。
你还须要去实战,碰一碰真正的面试题,纸上学来终觉浅。
固然我是在一开始就刷题了,并非等专栏、书都看完了才上手,我建议在刷专栏期间就去刷题练练手。
我是在 2016 年才知道 LeetCode 这个网站的,当时我看到同项目组的研究生在刷,他在国外读研,他说这玩意是必须刷的。
那时候还没中文版,全英文的我看着很高级就上去玩一玩,不怕各位笑话,第一题就不会,只能写出暴力解法,循环两个数相加之和来对比。
看了题解以后恍然大悟,暗骂本身好蠢,而后继续日后刷了几题成功被劝退,而后就没有而后了...
到如今 LeetCode 上的题也愈来愈多了,按顺序刷就太"蠢"了,根本就不必全刷,要刷经典题,归类刷,把一类题型刷出感受来才罢休。
通常经典的常见的类型无非是 BFS、DFS、双指针、前缀、背包、二分、链表、二叉树、滑动窗口、堆(Top K)、栈、动态规划、回溯、滑动窗口、位运算、图、各类排序等等。
其实还有一些数学类型的题目,我选择放弃,哈哈哈。
正常状况下面试也不会问数学类型的,至于上述所说的题型,已经有一份很 nice 的算法笔记帮你总结了,很完备,很贴心,1730 页,20W 字,汇总了各大题型,基本上每题都附上了各大佬们的高质量解题思路,并附上连接,方便查看原文,我随便截几张图给你们看看。
这个算法汇老是我向鲂姐讨来的,一位刷题找工做的研三党,鲂姐以后打算提供一些关于学习,简历修改,求职路线的1v1辅导服务,敬请期待~
这份总结 PDF 请拉到文末获取。
我再来提一个我我的认为很重要的解题技巧:主干先行再填充细节。这个编码技巧其实不只仅关乎算法,平日的代码也建议按这个思路写。
我举冒泡排序这个很简单的例子来解释一下这句话的意思。
箭头指向的其实就是交换两个位置内容的代码,能够封装一下,变成下面这样。
这个例子的代码太简单了因此不封装也没事,不过我想提的就是这种封装的思想。
通常而言面试官能够在线实时看到你的编码,他看的不只仅是你的题解,还包括你的代码风格,排版等等,这也是很关键的一部分。
因此碰到是一些代码比较多的题目时候,注意方法的封装,不要一大坨都写在一块儿。
主干先行的意思是,例如上面的 swap 方法的实现先不要写,你当本身已经实现了 swap 方法来用就行,这就是先完善主干,清晰思路。 这样的代码看起来就不会凌乱,你本身调理也比较清晰。
等主干写完了以后,再去实现你封装的方法,也就是填充细节。
固然有人是一坨写完了,而后再进行重构,可是我以为重构是重构,和我说的这种编码技巧不是一个方向。
我要表达的点是在编写代码的时候展现清晰的思路,而且对你我的而言这种作法也更简单,不会让一些细节干扰你的主线。
可能就冒泡排序而言太简单的,感觉不太深入,你们能够在平时刷题时候练练,相信你能体会到这种作法的好处。
可能你们也看过不少学习算法的分享,不少本书、不少网站、不少课程,多并不必定是好事。
我我的认为一个专栏、一个网站、一本书、一份算法笔记对于我这种后端程序员来讲足以,不要想着这个课好像不错,这个书好像不少人推,我能够很负责的告诉你,就我提到的这几个你吃透了,你基本上是「化神期」修士了。
还有上面的提到的鲂姐的算法笔记,后台回复「123」便可领取。
我是 yes,从一点点到亿点点,咱们下篇见。
扫码可关注个人公众号哦~