1. 程式人生 > 其它 >搞定大廠演算法面試之leetcode精講1.開篇介紹

搞定大廠演算法面試之leetcode精講1.開篇介紹

搞定大廠演算法面試之leetcode精講1.開篇介紹

視訊教程(高效學習):點選學習

目錄:

1.開篇介紹

2.時間空間複雜度

3.動態規劃

4.貪心

5.二分查詢

6.深度優先&廣度優先

7.雙指標

8.滑動視窗

9.位運算

10.遞迴&分治

11剪枝&回溯

12.堆

13.單調棧

14.排序演算法

15.連結串列

16.set&map

17.棧

18.佇列

19.陣列

20.字串

21.樹

22.字典樹

23.並查集

24.其他型別題

為什麼要學習資料結構和演算法

  1. 面試需要
    大家都知道,國內外的一二線網際網路公司都需要面試演算法,像google、fb或者像阿里、位元組這樣的公司,都喜歡在面試的最後環節讓候選人手寫一段程式碼解決某個問題,甚至是需要白板程式設計,沒有任何編輯器的提示,這就需要候選者有紮實的資料結構和演算法的功力,而且對編碼習慣、程式碼風格、設計模式都有較高的要求。不管是前端、後端、不管用什麼語言,這些程式設計思想和解決問題的方式都是一致的。
    那麼為什麼這麼多公司都喜歡考察資料結構和演算法呢?這是因為啊,面試短短的1、2個小時,面試官很難判斷候選人的能力,就算是考察專案經驗和以往的開發經驗,由於面試官沒有參與過你開發過專案或者研發方向,也很難理解候選人面臨的問題和挑戰。而考察資料結構和演算法,既是對程式設計基礎的考察,又能很好的考量解決問題的能力、思考問題的方式和路徑,以及編碼的習慣和風格。

    ​ 不知道大家有沒有這樣的感覺,就是面試了很多公司,一到面試演算法的部分總是掉鏈子,刷了很多題,但是依然寫不好,總是掛在手寫題上,或者明明有能力但面試的時候卻說不出來,究其原因就是缺少正確的刷題方式和方法、以及刻意的練習。

  2. 核心能力的提升

    ​ 資料結構和演算法是程式設計師最核心的能力,不管負責什麼業務,是前端還是後端還是人工智慧領域的工程師、這項能力都是一個必備的最基礎的能力。為什麼資料結構和演算法這麼重要呢。

    ​ 我們日常開發用到的大量的框架、庫,都是以資料結構和演算法為基礎設計出來的,舉個例子,react原始碼中就用到了大量的連結串列,還有小頂堆這些資料結構,作為使用了react

    多年的工程師,如果對日常使用的框架的底層原理和執行邏輯沒有一個大概的認識,怎麼能設計好技術方案,做好選型以及專案優化改進呢。資料結構和演算法就好比武俠小說裡的內力,而大家學的框架、庫都是招式,框架經常會變,而資料結構和演算法卻是最基礎也是最核心的能力,招式用的好不好,打出來的效果怎樣,都需要強大的內功來支撐。

    ​ 千萬不要說這些資料結構和演算法我平時工作用不到啊,其實恰恰相反,如果想深挖技術,想要用演算法提升程式執行的效率,或者提高自己的編碼能力,學習資料結構和演算法是一個非常好的方式,這也是我們的核心競爭力之一

  3. 提升職業生涯的高度

    ​ 不知道大家有沒有遇見過一些技術很厲害的程式設計師,不管在哪家公司,他們總能找到自己的位置,隨著時間的推移,獨立lead一個專案或者帶團隊都是遲早的事,為什麼這些人職業生涯會走的更遠呢?引用喬布斯的一句話,“Stay hungry,Stay foolish”。

    ​ 要想職業生涯走的更高更遠就需要不斷精進自己的技術和能力,比如程式設計師最核心的資料結構和演算法的能力,當然,如果走向了技術管理層,還需要技術的前瞻性和管理能力,這些都是需要方法和刻意練習。時刻保持危機感,不要只停留在某個技術的使用層面,只有這樣能選擇機會才會更多。

    ​ 這裡我分享一些個人的經驗,不要相信所謂的35歲危機,本質就是到了相應的年齡就需更高的能力,不要做無效的內卷,但是基礎的資料結構和演算法卻是必須的。底層能力才能決定我們走多遠。

怎樣學習資料結構和演算法

  1. 瞭解基礎的資料結構:比如連結串列、棧、佇列、樹等等,可以藉助部落格,書籍,課程進行學習,書籍比如「javascript資料結構與演算法」,以及其他語言的資料結構和演算法的書籍,不推薦「演算法導論」,因為推理和證明性的內容很多。
  2. 按照類別刻意練習:按照leetcode上的分類進行刷題,比如按照動態規劃、分治、回溯等分類練習,leetcode題目雖然多,但如果按類別來刷,其實也沒多少,很多題目都是類似的套路和延伸,掌握其中面試熱門的一百多道就足夠應付面試了。

如何刷題:

  1. 切碎知識點:對每個型別的題目形成一套解題思路和模版,比如解動態規劃的步驟有
    • 根據重疊子問題定義狀態
    • 尋找最優子結構推導狀態轉移方程
    • 確定dp初始狀態
    • 確定輸出值
  2. 刻意練習:要練習缺陷的、弱的地方,那些寫起來不舒服、不爽、枯燥的題目就是薄弱點,不要只練習熟悉型別的題
  3. 反饋:在leetcode上尋找別人的解題思路,包括評論區的討論,還有程式的執行時間和佔用記憶體的資料,順便提一句,leetcode的執行時間和佔用記憶體情況的資料不準確,就當個參考就好,不要太在意執行時間的排名。
  4. 多寫:反覆練習,加強記憶,三分學,七分練。
  5. 總結規律;將刷題的套路總結成自己方法,比如拆解問題、找基本的子問題、問題的組裝、數學歸納等等。最後這些方法落實到程式碼層面無非是if else,for while、遞迴等,總結了這些規律,才能在題目變化的時候還能找到正確的解題路徑。題目做多了也會有相應的感覺,有時從題目要求中也能明顯的感覺到該用什麼演算法,比如題中提到了用O(logn)的複雜度來解,那很有可能要用到二分法,提到了O(nlogn),那可能是用歸併或者快排的思想解題。

面試時如何做一道題

  • 明確題意:有不清楚的地方要和麵試官明確題目的意思,包括程式的特殊資料輸入,資料量,邊界條件的處理等等。

  • 可能的解:要儘可能的列出你知道的方法,對比他們的優劣勢,選擇你認為最好的方法進行編碼。不要小看暴力解法,它往往是題目思考和優化的起點。

  • 寫完之後進行復雜度分析:包括時間和空間複雜度分析。

    ​ 面試官往往是考察思考和解決問題的方式,我們要儘量的讓面試官看到我們思考的路徑和過程,即使最後的執行結果不太正確,也不一定會影響最後的錄用,可能也就是因為某個條件或者返回值出現了問題。

    ​ 在面試的過程中,如果完全沒有思路,也可以向面試官尋求提示和幫助,人無完人,就算是在平時的工作中我們也會遇到困難,這不丟人,積極尋找幫助也是推進專案前進的方式,沒有問題有時候才是最大的問題。如果確定這道題是你完全沒有遇到過的,可以要求面試官更換一道題,與其浪費時間思考,不如直接換一道,也許換了之後就是熟悉的題目了,知識點和題目這麼多,每個人都有自己的知識盲區。不要想著面試官是監考的老師,而是未來的同事,面試不是考試,大多數題都沒有標準答案,有時候只要表現的比其他候選人更好一點就可以了。

課程特色

  • leetcode分類講解:對leetcode高頻面試題進行分類講解,講到對應的題目時,會介紹對應的資料結構,它有什麼特點,以及它的實現,比如堆的實現、字典樹的實現等,然後會介紹這道題相應的演算法,比如遞迴,回溯、貪心、動態規劃等。
  • 思考路徑和套路:每道題都會列出儘可能多的解題方式,以及複雜度分析,然後講解思考的路徑,同類型的題總結相應的套路,比如二分法,雙指標,動態規劃,dfs,bfs等的模版。
  • 題目量和難度達到面試的要求:目前課程包涵174道高頻面試題,後續會不定時增加新的面試題,其他同類型的題目基本都是這些問題的變種和延伸,hard題22道,medium題83道,easy題69道,每道題都有詳細的註釋,後面還會更新更多大廠高頻面試題
  • 節省時間:難題理解困難,解法看不懂,花了大量時間刷題還是刷不會,這可能是大家最頭疼的問題了,這門課程會講解必要的前置知識,相應的解題套路,大量的圖解配合視訊講解,不多廢話,做到通俗易懂,節省大家的理解和刷題成本。在面試前幾天快速進入做題的狀態。
  • 解題語言:這門課主要主要的用JavaScript來解題,也會附上Java的解題程式碼,資料結構和演算法與相應的實現語言沒有太大關係,不管用python還是Go,其實理解了邏輯和方法,只需要相應的改一下if else,for while,陣列和物件的宣告等等,就可以用對應的語言來解題了。

適合人群

  • 應屆校招生:校招門檻水漲船高,對同學們的能力要求也越來越高,當然薪資肯定也是一年比一年高,做到提前準備,提前刷題,對於處於即將畢業的計算機學科的同學來說還是很必要的。
  • 演算法薄弱在職工程師:社招的同學如果是想進入bat、美團、位元組這樣的公司,演算法的考察基本是必考的,就算是一些中型的公司,現在也越來越多的考察同學們的基礎能力了,對演算法的考察也是非常重要的一個環節。

課程大綱和目錄