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

每一個時代,都不會虧待會學習的人。程序員

你們好,我是 yes。面試

我持續在 LeetCode 刷算法題將近有一年半的時間了,這一年半以來我對算法的見解改變了不少,可是實話實說支持我前進的仍是面試。算法

在以前的文章提到過我是面試驅動型選手,我享受面試官問我啥我都嘴角一翹微微一笑的那種不羈,而近年來算法在面試中的比重愈來愈大,因此我花了很大的精力去攻克算法這道難關,確實有點難後端

我不是天賦型選手,甚至以爲本身有點蠢,在刷題的過程當中常常被各類打擊,最誇張的就是同一道題刷了 4 次,過一段時間去寫仍是不會,從下面的這些草稿能夠看出我當時心裏的那種崩潰。數組

1240

固然還有給本身加油打氣的(不要嫌棄個人字醜哈)。緩存

1240

通過了三本書的系統學習、一年半的刷題,三篇專欄的屢次學習,搞了不少大廠的真題練習,基本上有點穩了。數據結構

這篇文章想分享一下我面向面試學習算法的一些心得,因此算法大牛、算法愛好者能夠關閉這個頁面了,這是一篇面向通常程序員的算法面試攻略。數據結構和算法

在去年我還參加一個話題回答,「數據結構與算法的學習中,面對經典代碼是選擇本身實現仍是背誦?」,一不當心就被選上中獎了,嘿嘿。原本還想把獎品搞個抽獎送出去的,可是這個包裝被我扔了,由於兩張算法大地圖須要長筒來裝,很差運輸,以後再看看吧。ide

1240

來看看我是怎麼回答這個問題的吧。學習

數據結構與算法的學習中,面對經典代碼是選擇本身實現仍是背誦?

我以爲學習算法就是理解+持續練習+刻意的背誦(有選擇性的背誦)

有些人學習算法多是興趣愛好啥的,很直白的說我就是功利性的學習,而且可以由於功利心而持續學習。

由於功利我想快速獲得收益的最大化,可是欲速則不達,所以我會在功利的狀況下理性的學習算法。

一、首先鞏固基礎,萬丈高樓平地起。算法就是使用各類數據結構按照必定的流程運行,管你五花八門稀奇古怪的算法題都逃脫不了數組和鏈表。在數組和鏈表之上特殊功能化了不少有特殊意義的數據結構:隊列,棧等。

數據結構都是由於不一樣的場景有不一樣的需求而演化而來,所以在某個場景數組更合適,某個場景鏈表更合適,你所須要知道的就是它們分別的優缺點和使用的場景,並能知其然而知其因此然。

例如數組下標訪問高效,是由於內存連續,所以對 CPU 緩存親和性更高等。這樣使用才能遊刃有餘,有的放矢。

二、持續練習,光說不練假把式,單單看是沒用的,不上手便成空

我沒那算法的天賦,在我認爲我對基本數據結構有了必定的瞭解的狀況下,看到有些算法題仍是蒙圈,沒那思路,腦殼空空,那也只能練唄。

遇到徹底沒思路的題目最多 5 分鐘我就會去找題解,有可能 2 分鐘,由於功利嘛,還有一部分我以爲我沒那腦子我認清本身哈哈哈。

可是在找題解的時候我是秉着一個必須充分理解的目的去的,不理解不放棄,開玩笑答案至少我仍是得看懂吧(這句話我如今收回,當時仍是太年輕)。

固然這裏的不放棄不是指這半天或者一天內必定要搞定。有時候就會陷入瓶頸,隔一天,或者去玩一下回來就會豁然開朗。

經過持續的練習,你腦子裏就會漸漸的瞭解這些題目的套路,你也能更好的關聯各類數據結構,這就是感受來了,你會發現本身變聰明瞭,這就是要進入良性循環了,而且持續的練習,你會發現某一天若是你沒寫算法題的時候會有一種罪惡感!

還有我不會藉助 IDE 寫,就在 LeetCode 上直接寫,一個一個本身敲,時刻爲着之後面試寫題做準備,沒錯就是這麼功利

三、刻意的背誦(有選擇性的背誦)

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

可是我認爲單單理解仍是不夠的,理解+練習是可讓你作出題目,可是作不到讓你不假思索的作出題目,在面試的這種緊張的狀況下,只有相似肌肉記憶才能給面試官最強烈的打擊,稍微的緊張可能就會致使連環出錯,滿盤皆輸!

所以對於那些經典的代碼,經常使用的例如二分查找,快排等我都會刻意的背誦,達到聽到二分查找,腦子裏就有那麼些代碼出現的程度,沒錯我仍是這麼的功利。

也就是說平時刷的算法題都要理解,可是一些經典的代碼我認爲理解還不夠,須要背誦造成肌肉記憶。

有些人可能會以爲,沒啥好背的啊,多多練習就會了,額其實多多練習就等於背,是吧你說你寫個十幾遍不就等於背麼。只是我是刻意的背。


嘖嘖,我以爲我說的真好,哈哈哈。

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

一、掌握好基礎,也就是那些經常使用的數據結構和算法,好比隊列、棧、堆、歸排、快排、二分、動態規劃等等,熟悉這些經典數據結構和算法,通透的得知他們的適用場景。

解題無非就是將它們套上去,絕對不會叫你創新,你所作的就是套模板,就看你模板選的對不對,套的熟不熟罷了。

二、持續練習,這玩意是最重要的。由於叫不少人看東西沒問題,讓他上手就會有拖延症,感受有點麻煩。

可是算法就是得練,沒有什麼其餘選擇,不用耍啥小聰明,除非你過目不忘

由於它的解題思路不太符合正常人的思考,因此你須要持續的練習,讓你的思惟轉變過來,造成看到這類的題目就會有應激反應。

還有兩點很關鍵,我強調一下:

  • 不要花太多時間在一道題上,幾分鐘沒思路就看題解,看了題解再進行理解和默寫。

  • 不要用 IDE 寫,面試的時候就是沒聯想提示的,有時候甚至是手寫,因此在平時就要作好準備,不打無準備之仗。

上面其實講的就是平日學習和刷題的套路,接下來說講如何上手。

上手攻略

我選擇小爭哥的《數據結構與算法之美》專欄,這個專欄我刷了兩遍,雖然說我還看了別的專欄,可是這個夠了,上手絕佳,貼個專欄的圖吧。幾乎涵蓋了全部的數據結構和算法書籍涉及到的知識點

1240

我就是看這個入門的,基本的套路講解的很全,推薦先把專欄全面的看一遍,把每節課涉及的到代碼本身敲一遍

能夠按如下學習順序、難易程度和重點程度來學習這個專欄。

1240

而後再二刷,二刷的目的是提煉和總結,我來貼一下我以前的個別章節總結,這是以前參加算法打卡活動留下的。

1240

刷完以後,一些經典數據結構和算法至少都認識,也說得上來,基本上算是入門了。

而後再去看《算法(第4版)》這本書,雖然說我看了三本算法書可是我以爲這本夠了。

1240

通常而言你們都會先推薦書,畢竟書都比較全也更加系統,可是我喜歡反其道而行之。

由於書太厚了,厚就容易勸退,特別是在你對一個領域不太熟悉的時候。

因此我更喜歡先去學別人提煉過的付費專欄,提煉出來的都是重點,讓我對核心知識脈絡有了充分的認識以後,再去看書來查漏補缺,創建完善的體系

由於在你已經瞭解大體核心知識點後,你再去看大頭書就會有一種熟悉感和共鳴感,這種感受可讓你把書從頭看到尾。

至於爲何看了專欄以後還得看書,是由於專欄畢竟是被人提煉過的,而書的知識點大多都是完整的,你先吸取別人提煉過的知識點,帶着別人的想法再去系統的學習,從其中再糅合出本身的總結,這樣東西才真的是你的

系統的學習完這本書以後,感受本身好像很厲害了?

並非。

你還須要去實戰,碰一碰真正的面試題,紙上學來終覺淺

固然我是在一開始就刷題了,並非等專欄、書都看完了才上手,我建議在刷專欄期間就去刷題練練手。

我是在 2016 年才知道 LeetCode 這個網站的,當時我看到同項目組的研究生在刷,他在國外讀研,他說這玩意是必須刷的。

那時候還沒中文版,全英文的我看着很高級就上去玩一玩,不怕各位笑話,第一題就不會,只能寫出暴力解法,循環兩個數相加之和來對比。

1240

看了題解以後恍然大悟,暗罵本身好蠢,而後繼續日後刷了幾題成功被勸退,而後就沒有而後了...

到如今 LeetCode 上的題也愈來愈多了,按順序刷就太"蠢"了,根本就不必全刷,要刷經典題,歸類刷,把一類題型刷出感受來才罷休。

通常經典的常見的類型無非是 BFS、DFS、雙指針、前綴、揹包、二分、鏈表、二叉樹、滑動窗口、堆(Top K)、棧、動態規劃、回溯、滑動窗口、位運算、圖、各類排序等等。

其實還有一些數學類型的題目,我選擇放棄,哈哈哈。

正常狀況下面試也不會問數學類型的,至於上述所說的題型,已經有一份很 nice 的算法筆記幫你總結了,很完備,很貼心,1730 頁,20W 字,彙總了各大題型,基本上每題都附上了各大佬們的高質量解題思路,並附上連接,方便查看原文,我隨便截幾張圖給你們看看。

1240

1240

這個算法匯老是我向魴姐討來的,一位刷題找工做的研三黨,魴姐以後打算提供一些關於學習,簡歷修改,求職路線的1v1輔導服務,敬請期待~

這份總結 PDF 請拉到文末獲取。

解題技巧

我再來提一個我我的認爲很重要的解題技巧:主幹先行再填充細節。這個編碼技巧其實不只僅關乎算法,平日的代碼也建議按這個思路寫。

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

1240

箭頭指向的其實就是交換兩個位置內容的代碼,能夠封裝一下,變成下面這樣。

1240

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

通常而言面試官能夠在線實時看到你的編碼,他看的不只僅是你的題解,還包括你的代碼風格,排版等等,這也是很關鍵的一部分。

因此碰到是一些代碼比較多的題目時候,注意方法的封裝,不要一大坨都寫在一塊兒

主幹先行的意思是,例如上面的 swap 方法的實現先不要寫,你當本身已經實現了 swap 方法來用就行,這就是先完善主幹,清晰思路。 這樣的代碼看起來就不會凌亂,你本身調理也比較清晰。

等主幹寫完了以後,再去實現你封裝的方法,也就是填充細節

固然有人是一坨寫完了,而後再進行重構,可是我以爲重構是重構,和我說的這種編碼技巧不是一個方向。

我要表達的點是在編寫代碼的時候展現清晰的思路,而且對你我的而言這種作法也更簡單,不會讓一些細節干擾你的主線。

可能就冒泡排序而言太簡單的,感覺不太深入,你們能夠在平時刷題時候練練,相信你能體會到這種作法的好處。

最後

可能你們也看過不少學習算法的分享,不少本書、不少網站、不少課程,多並不必定是好事

我我的認爲一個專欄、一個網站、一本書、一份算法筆記對於我這種後端程序員來講足以,不要想着這個課好像不錯,這個書好像不少人推,我能夠很負責的告訴你,就我提到的這幾個你吃透了,你基本上是「化神期」修士了。

還有上面的提到的魴姐的算法筆記,後臺回覆「123」便可領取。


我是 yes,從一點點到億點點,咱們下篇見

掃碼可關注個人公衆號哦~

2083803-20200926161532329-1978221295.png

相關文章
相關標籤/搜索