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