這份算法攻略,我拿到了5個大廠的offer

每個時代倘零,都不會虧待會學(xué)習(xí)的人。

大家好拷泽,我是 yes袖瞻。

我持續(xù)在 LeetCode 刷算法題將近有一年半的時間了聋迎,這一年半以來我對算法的看法改變了很多,但是實話實說支持我前進的還是面試羹唠。

在之前的文章提到過我是面試驅(qū)動型選手娄昆,我享受面試官問我啥我都嘴角一翹微微一笑的那種不羈缝彬,而近年來算法在面試中的比重越來越大,所以我花了很大的精力去攻克算法這道難關(guān)扒俯,確實有點難一疯。

我不是天賦型選手墩邀,甚至覺得自己有點蠢,在刷題的過程中經(jīng)常被各種打擊荔茬,最夸張的就是同一道題刷了 4 次竹海,過一段時間去寫還是不會,從下面的這些草稿可以看出我當(dāng)時內(nèi)心的那種崩潰孔飒。

當(dāng)然還有給自己加油打氣的(不要嫌棄我的字丑哈)。

經(jīng)過了三本書的系統(tǒng)學(xué)習(xí)菩鲜、一年半的刷題接校,三篇專欄的多次學(xué)習(xí)狮崩,搞了很多大廠的真題練習(xí),基本上有點穩(wěn)了诽凌。

這篇文章想分享一下我面向面試學(xué)習(xí)算法的一些心得坦敌,所以算法大牛、算法愛好者可以關(guān)閉這個頁面了杜顺,這是一篇面向一般程序員的算法面試攻略蘸炸。

在去年我還參加一個話題回答搭儒,「數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí)中,面對經(jīng)典代碼是選擇自己實現(xiàn)還是背誦?」馁菜,一不小心就被選上中獎了铃岔,嘿嘿。本來還想把獎品搞個抽獎送出去的铲咨,但是這個包裝被我扔了蜓洪,因為兩張算法大地圖需要長筒來裝隆檀,不好運輸粹湃,之后再看看吧泉坐。

來看看我是怎么回答這個問題的吧腕让。

數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí)中,面對經(jīng)典代碼是選擇自己實現(xiàn)還是背誦?

我覺得學(xué)習(xí)算法就是理解+持續(xù)練習(xí)+刻意的背誦(有選擇性的背誦)偏形。

有些人學(xué)習(xí)算法可能是興趣愛好啥的觉鼻,很直白的說我就是功利性的學(xué)習(xí),并且能夠因為功利心而持續(xù)學(xué)習(xí)萨惑。

因為功利我想快速得到收益的最大化仇矾,但是欲速則不達若未,因此我會在功利的情況下理性的學(xué)習(xí)算法。

1、首先鞏固基礎(chǔ)乌昔,萬丈高樓平地起磕道。算法就是使用各種數(shù)據(jù)結(jié)構(gòu)按照一定的流程運行,管你五花八門稀奇古怪的算法題都逃脫不了數(shù)組和鏈表伶丐。在數(shù)組和鏈表之上特殊功能化了很多有特殊意義的數(shù)據(jù)結(jié)構(gòu):隊列疯特,棧等。

數(shù)據(jù)結(jié)構(gòu)都是因為不同的場景有不同的需求而演化而來录别,因此在某個場景數(shù)組更合適,某個場景鏈表更合適葫男,你所需要知道的就是它們分別的優(yōu)缺點和使用的場景崔列,并能知其然而知其所以然赵讯。

例如數(shù)組下標(biāo)訪問高效,是因為內(nèi)存連續(xù)猪贪,因此對 CPU 緩存親和性更高等讯私。這樣使用才能游刃有余,有的放矢桶癣。

2娘锁、持續(xù)練習(xí),光說不練假把式间雀,單單看是沒用的镊屎,不上手便成空缝驳。

我沒那算法的天賦,在我認(rèn)為我對基本數(shù)據(jù)結(jié)構(gòu)有了一定的了解的情況下运怖,看到有些算法題還是蒙圈夏伊,沒那思路,腦袋空空吗购,那也只能練唄。

遇到完全沒思路的題目最多 5 分鐘我就會去找題解镀梭,有可能 2 分鐘踱启,因為功利嘛埠偿,還有一部分我覺得我沒那腦子我認(rèn)清自己哈哈哈。

但是在找題解的時候我是秉著一個必須充分理解的目的去的羽圃,不理解不放棄抖剿,開玩笑答案至少我還是得看懂吧(這句話我現(xiàn)在收回,當(dāng)時還是太年輕)斩郎。

當(dāng)然這里的不放棄不是指這半天或者一天內(nèi)一定要搞定缩宜。有時候就會陷入瓶頸,隔一天妓布,或者去玩一下回來就會豁然開朗宋梧。

通過持續(xù)的練習(xí),你腦子里就會漸漸的了解這些題目的套路,你也能更好的關(guān)聯(lián)各種數(shù)據(jù)結(jié)構(gòu)跺讯,這就是感覺來了殉农,你會發(fā)現(xiàn)自己變聰明了,這就是要進入良性循環(huán)了愈污,并且持續(xù)的練習(xí),你會發(fā)現(xiàn)某一天如果你沒寫算法題的時候會有一種罪惡感首装!

還有我不會借助 IDE 寫仙逻,就在 LeetCode 上直接寫涧尿,一個一個自己敲,時刻為著以后面試寫題作準(zhǔn)備缺亮,沒錯就是這么功利桥言。

3限书、刻意的背誦(有選擇性的背誦)

有人會說算法是要理解的,死記硬背是沒用的能真。沒錯理解是肯定要理解的扰柠,死記硬背肯定過兩天就會忘了。

但是我認(rèn)為單單理解還是不夠的蝙泼,理解+練習(xí)是可以讓你做出題目劝枣,但是做不到讓你不假思索的做出題目舔腾,在面試的這種緊張的情況下,只有類似肌肉記憶才能給面試官最強烈的打擊哗脖,稍微的緊張可能就會導(dǎo)致連環(huán)出錯,滿盤皆輸橱夭!

因此對于那些經(jīng)典的代碼桑逝,常用的例如二分查找肢娘,快排等我都會刻意的背誦,達到聽到二分查找而钞,腦子里就有那么些代碼出現(xiàn)的程度拘荡,沒錯我還是這么的功利珊皿。

也就是說平時刷的算法題都要理解,但是一些經(jīng)典的代碼我認(rèn)為理解還不夠粉臊,需要背誦形成肌肉記憶驶兜。

有些人可能會覺得抄淑,沒啥好背的啊,多多練習(xí)就會了矗愧,額其實多多練習(xí)就等于背郑原,是吧你說你寫個十幾遍不就等于背么犯犁。只是我是刻意的背。


嘖嘖,我覺得我說的真好晓避,哈哈哈。

再補充一下這個回答的個別觀點:

1吼句、掌握好基礎(chǔ)事格,也就是那些常用的數(shù)據(jù)結(jié)構(gòu)和算法,比如隊列远搪、棧谁鳍、堆劫瞳、歸排志于、快排、二分伺绽、動態(tài)規(guī)劃等等憔恳,熟悉這些經(jīng)典數(shù)據(jù)結(jié)構(gòu)和算法,通透的得知他們的適用場景输硝。

解題無非就是將它們套上去点把,絕對不會叫你創(chuàng)新屿附,你所做的就是套模板挺份,就看你模板選的對不對,套的熟不熟罷了优训。

2、持續(xù)練習(xí)揣非,這玩意是最重要的抡医。因為叫很多人看東西沒問題繁涂,讓他上手就會有拖延癥趴俘,感覺有點麻煩。

但是算法就是得練疆虚,沒有什么其他選擇搞监,不用耍啥小聰明水孩,除非你過目不忘

因為它的解題思路不太符合正常人的思考腺逛,所以你需要持續(xù)的練習(xí),讓你的思維轉(zhuǎn)變過來棍矛,形成看到這類的題目就會有應(yīng)激反應(yīng)安疗。

還有兩點很關(guān)鍵,我強調(diào)一下:

  • 不要花太多時間在一道題上够委,幾分鐘沒思路就看題解荐类,看了題解再進行理解和默寫。
  • 不要用 IDE 寫茁帽,面試的時候就是沒聯(lián)想提示的玉罐,有時候甚至是手寫,所以在平時就要做好準(zhǔn)備潘拨,不打無準(zhǔn)備之仗吊输。

上面其實講的就是平日學(xué)習(xí)和刷題的套路,接下來講講如何上手铁追。

上手攻略

我選擇小爭哥的《數(shù)據(jù)結(jié)構(gòu)與算法之美》專欄季蚂,這個專欄我刷了兩遍,雖說我還看了別的專欄琅束,但是這個夠了扭屁,上手絕佳,貼個專欄的圖吧涩禀。幾乎涵蓋了所有的數(shù)據(jù)結(jié)構(gòu)和算法書籍涉及到的知識點料滥。

我就是看這個入門的,基本的套路講解的很全艾船,推薦先把專欄全面的看一遍葵腹,把每節(jié)課涉及的到代碼自己敲一遍高每。

可以按以下學(xué)習(xí)順序、難易程度和重點程度來學(xué)習(xí)這個專欄礁蔗。

然后再二刷觉义,二刷的目的是提煉和總結(jié),我來貼一下我之前的個別章節(jié)總結(jié)浴井,這是之前參加算法打卡活動留下的。

刷完之后霉撵,一些經(jīng)典數(shù)據(jù)結(jié)構(gòu)和算法至少都認(rèn)識磺浙,也說得上來,基本上算是入門了徒坡。

然后再去看《算法(第4版)》這本書撕氧,雖說我看了三本算法書但是我覺得這本夠了。

一般而言大家都會先推薦書喇完,畢竟書都比較全也更加系統(tǒng)伦泥,但是我喜歡反其道而行之。

因為書太厚了锦溪,厚就容易勸退不脯,特別是在你對一個領(lǐng)域不太熟悉的時候。

所以我更喜歡先去學(xué)別人提煉過的付費專欄刻诊,提煉出來的都是重點防楷,讓我對核心知識脈絡(luò)有了充分的認(rèn)識之后,再去看書來查漏補缺则涯,建立完善的體系复局。

因為在你已經(jīng)了解大致核心知識點后,你再去看大頭書就會有一種熟悉感和共鳴感粟判,這種感覺可以讓你把書從頭看到尾亿昏。

至于為什么看了專欄之后還得看書,是因為專欄畢竟是被人提煉過的档礁,而書的知識點大多都是完整的角钩,你先吸收別人提煉過的知識點,帶著別人的想法再去系統(tǒng)的學(xué)習(xí)事秀,從其中再糅合出自己的總結(jié)彤断,這樣?xùn)|西才真的是你的

系統(tǒng)的學(xué)習(xí)完這本書之后易迹,感覺自己好像很厲害了宰衙?

并不是。

你還需要去實戰(zhàn)睹欲,碰一碰真正的面試題供炼,紙上學(xué)來終覺淺一屋。

當(dāng)然我是在一開始就刷題了,并不是等專欄袋哼、書都看完了才上手冀墨,我建議在刷專欄期間就去刷題練練手。

我是在 2016 年才知道 LeetCode 這個網(wǎng)站的涛贯,當(dāng)時我看到同項目組的研究生在刷诽嘉,他在國外讀研,他說這玩意是必須刷的弟翘。

那時候還沒中文版虫腋,全英文的我看著很高級就上去玩一玩,不怕各位笑話稀余,第一題就不會悦冀,只能寫出暴力解法,循環(huán)兩個數(shù)相加之和來對比睛琳。

看了題解之后恍然大悟盒蟆,暗罵自己好蠢,然后繼續(xù)往后刷了幾題成功被勸退师骗,然后就沒有然后了...

到現(xiàn)在 LeetCode 上的題也越來越多了历等,按順序刷就太"蠢"了,根本就沒必要全刷丧凤,要刷經(jīng)典題募闲,歸類刷,把一類題型刷出感覺來才罷休愿待。

一般經(jīng)典的常見的類型無非是 BFS浩螺、DFS、雙指針仍侥、前綴要出、背包、二分农渊、鏈表患蹂、二叉樹、滑動窗口砸紊、堆(Top K)传于、棧、動態(tài)規(guī)劃醉顽、回溯沼溜、滑動窗口、位運算游添、圖系草、各種排序等等通熄。

其實還有一些數(shù)學(xué)類型的題目,我選擇放棄找都,哈哈哈唇辨。

正常情況下面試也不會問數(shù)學(xué)類型的,至于上述所說的題型能耻,已經(jīng)有一份很 nice 的算法筆記幫你總結(jié)了赏枚,很完備,很貼心晓猛,1730 頁嗡贺,20W 字,匯總了各大題型鞍帝,基本上每題都附上了各大佬們的高質(zhì)量解題思路,并附上鏈接煞茫,方便查看原文帕涌,我隨便截幾張圖給大家看看。

這個算法匯總是我向魴姐討來的续徽,一位刷題找工作的研三黨蚓曼,魴姐之后打算提供一些關(guān)于學(xué)習(xí),簡歷修改钦扭,求職路線的1v1輔導(dǎo)服務(wù)纫版,敬請期待~

這份總結(jié) PDF 請拉到文末獲取。

解題技巧

我再來提一個我個人認(rèn)為很重要的解題技巧:主干先行再填充細(xì)節(jié)客情。這個編碼技巧其實不僅僅關(guān)乎算法其弊,平日的代碼也建議按這個思路寫。

我舉冒泡排序這個很簡單的例子來解釋一下這句話的意思膀斋。

箭頭指向的其實就是交換兩個位置內(nèi)容的代碼梭伐,可以封裝一下,變成下面這樣仰担。

這個例子的代碼太簡單了所以不封裝也沒事糊识,不過我想提的就是這種封裝的思想。

一般而言面試官可以在線實時看到你的編碼摔蓝,他看的不僅僅是你的題解赂苗,還包括你的代碼風(fēng)格,排版等等贮尉,這也是很關(guān)鍵的一部分拌滋。

所以碰到是一些代碼比較多的題目時候,注意方法的封裝绘盟,不要一大坨都寫在一起鸠真。

主干先行的意思是悯仙,例如上面的 swap 方法的實現(xiàn)先不要寫,你當(dāng)自己已經(jīng)實現(xiàn)了 swap 方法來用就行吠卷,這就是先完善主干锡垄,清晰思路。 這樣的代碼看起來就不會凌亂祭隔,你自己調(diào)理也比較清晰货岭。

等主干寫完了之后,再去實現(xiàn)你封裝的方法疾渴,也就是填充細(xì)節(jié)千贯。

當(dāng)然有人是一坨寫完了,然后再進行重構(gòu)搞坝,但是我覺得重構(gòu)是重構(gòu)搔谴,和我說的這種編碼技巧不是一個方向。

我要表達的點是在編寫代碼的時候展示清晰的思路桩撮,并且對你個人而言這種做法也更簡單敦第,不會讓一些細(xì)節(jié)干擾你的主線。

可能就冒泡排序而言太簡單的店量,感受不太深刻芜果,大家可以在平時刷題時候練練,相信你能體會到這種做法的好處融师。

最后

可能大家也看過很多學(xué)習(xí)算法的分享右钾,很多本書、很多網(wǎng)站旱爆、很多課程舀射,多并不一定是好事

我個人認(rèn)為一個專欄疼鸟、一個網(wǎng)站后控、一本書、一份算法筆記對于我這種后端程序員來說足以空镜,不要想著這個課好像不錯浩淘,這個書好像很多人推,我可以很負(fù)責(zé)的告訴你吴攒,就我提到的這幾個你吃透了张抄,你基本上是「化神期」修士了。

還有上面的提到的魴姐的算法筆記洼怔,私信「123」即可領(lǐng)取署惯。


我是 yes,從一點點到億點點镣隶,我們下篇見极谊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诡右,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轻猖,更是在濱河造成了極大的恐慌帆吻,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咙边,死亡現(xiàn)場離奇詭異猜煮,居然都是意外死亡,警方通過查閱死者的電腦和手機败许,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門王带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人市殷,你說我怎么就攤上這事愕撰。” “怎么了醋寝?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵盟戏,是天一觀的道長。 經(jīng)常有香客問我甥桂,道長,這世上最難降的妖魔是什么邮旷? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任黄选,我火速辦了婚禮,結(jié)果婚禮上婶肩,老公的妹妹穿的比我還像新娘办陷。我一直安慰自己,他們只是感情好律歼,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布民镜。 她就那樣靜靜地躺著,像睡著了一般险毁。 火紅的嫁衣襯著肌膚如雪制圈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天畔况,我揣著相機與錄音鲸鹦,去河邊找鬼。 笑死跷跪,一個胖子當(dāng)著我的面吹牛馋嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吵瞻,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼葛菇,長吁一口氣:“原來是場噩夢啊……” “哼甘磨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眯停,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤济舆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后庵朝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吗冤,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年九府,在試婚紗的時候發(fā)現(xiàn)自己被綠了椎瘟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡侄旬,死狀恐怖肺蔚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情儡羔,我是刑警寧澤宣羊,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站汰蜘,受9級特大地震影響仇冯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜族操,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一苛坚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧色难,春花似錦泼舱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笤妙,卻和暖如春冒掌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹲盘。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工宋渔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜限。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓皇拣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氧急,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容