面試大廠被吊打?別灰心,面試季必備的數據結構與算法學習指南來了!

數據結構與算法的重要性

前幾天和朋友聊面試,大家都比較想知道,到底怎麼才能進大廠,在說這個問題之前呢,我想給大家分享一個小故事。

我有個 Facebook 的朋友,他當年同時拿到了 Google 和 FB 的 offer,最後選擇了 FB,我瞭解了下他的面試過程,就一點,無論管是 Google 還是 FB 的面試,其中一個佔比非常大的權重就是數據結構與算法。

不管你面試什麼崗位,前端安卓也好,後端也罷,都必須考察算法,這關過了,基本上就沒太大問題了。他告訴我,那些大廠認爲,你能把最基本、最核心的算法都能搞定,那麼那些編程語言啊、不同的應用方向,開發框架啊對你來說一定不是難事。

這事兒在當時算刷新了我的認知了。

國內大廠,雖說沒有國外那麼誇張,但是數據結構與算法也基本是必考項目,我國內也有一些大廠的面試官朋友,他們告訴我,算法也是必考項,不過不同的是,也會相應的考察你技術方向的一些專業技能,比如如果你面試 Android,那 Android 方向的專業技能也是考察很重要的一個方向。

但無論如何,不管是國外大廠,還是國內大廠,算法與數據結構可以說是必考中的必考,這一關如果你過不去,那你進大廠基本別想了。

但是話說回來,即便這條是所有人都知道的共識,也不是所有人都能搞得定。有些人就是覺得自己基礎差、非科班,要麼知難而退,要麼沒有決心啃下這塊硬骨頭,這時候就體現每個人面對困難的方式了。

再退一步講,即便你不想加入大廠,IT 領域,如果你想喫技術這碗飯,長久來看,算法也會制約一個人的上限,等到技術更高深,經驗越豐富,算法的重要性會越來越明顯。

那麼,有人又問了,如何才能更好的啃下算法這塊骨頭呢?

無他,就是靠自己的毅力以及決心一點點啃下。一天不行,一個月;一個月不行,一年;有決心的人,啥學歷、智商或者資歷,那些都是藉口。

不過除了毅力和決心之外,其實學習還是有效率之差的。

互聯網時代,其實網上有很多免費零散的學習資料,也可以去leetcode上刷題,只要你用點心,也總能有一些幫助。但是恕我直言,很多時候,效率很重要,網上縱有很多免費消息,但是一來花費你的時間去整合,二來自己摸索也會踩不少坑,三是不夠系統。

接下來我這裏分享一份《2021最新版數據結構與算法面試題手冊》

2021最新版數據結構與算法面試題手冊

第一部分

1.哈希

  • 請說一說,Java中的HashMap的工作原理是什麼?
  • 介紹一下,什麼是Hashmap?
  • 講一講,如何構造一致性哈希算法
  • 請談一談,hashCode() 和equals() 方法的重要性體現在什麼地方?
  • 請問,Object作爲HashMap的key的話,對Object有什麼要求嗎?
  • 請問 hashset 存的數是有序的嗎?

2.二叉樹

  • 求二叉樹的最大深度
  • 求二叉樹的最小深度
  • 求二叉樹中節點的個數
  • 求二叉樹中葉子節點的個數
  • 求二叉樹中第k層節點的個數
  • 判斷二叉樹是否是平衡二叉樹
  • 判斷二叉樹是否是完全二叉樹
  • 兩個二叉樹是否完全相同
  • 兩個二叉樹是否互爲鏡像
  • 翻轉二叉樹or鏡像二叉樹
  • 求兩個二叉樹的最低公共祖先節點
  • 二叉樹的前序遍歷
  • 二叉樹的中序遍歷
  • 二叉樹的後序遍歷
  • 前序遍歷和後序遍歷構造二叉樹
  • 在二叉樹中插入節點
  • 輸入一個二叉樹和一個整數,打印出二叉樹中節點值的和等於輸入整數所有的路徑
  • 二叉樹的搜索區間
  • 二叉樹的層次遍歷
  • 二叉樹內兩個節點的最長距離
  • 不同的二叉樹
  • 判斷二叉樹是否是合法的二叉查找樹(BST)

3.鏈表

  • 談一談,bucket如果用鏈表存儲,它的缺點是什麼?
  • 有一個鏈表,奇數位升序偶數位降序,如何將鏈表變成升序?
  • 如何反轉單鏈表
  • 現在有一個單向鏈表,談一談,如何判斷鏈表中是否出現了環
  • 隨機鏈表的複製

4.數組

  • 寫一個算法,可以將一個二維數組順時針旋轉90度
  • 一個數組,除一個元素外其它都是兩兩相等,求那個元素?
  • 找出數組中和爲S的一對組合,找出一組就行
  • 求一個數組中連續子向量的最大和
  • 尋找一數組中前K個最大的數

5.排序

  • 用Java寫一個冒泡排序?
  • 介紹一下,排序都有哪幾種方法?請列舉出來
  • 介紹一下,歸併排序的原理是什麼?
  • 介紹一下,堆排序的原理是什麼?
  • 談一談,如何得到一個數據流中的中位數?
  • 你知道哪些排序算法,這些算法的時間複雜度分別是多少,解釋一下快排?

6.堆與棧

  • 請你解釋一下,內存中的棧(stack)、堆(heap) 和靜態區(static area) 的方法
  • 說一說,heap和stack有什麼區別
  • 最小的k個數
  • 滑動窗口最大值
  • 醜數
  • 前K個高頻元素
  • 有效的括號
  • 最小棧
  • 柱狀圖中最大的矩形

7.高級算法

  • 請你講講LRU算法的實現原理?
  • 爲什麼要設計 後綴表達式,有什麼好處?
  • 請你設計一個算法,用來壓縮一段URL?
  • 談一談,id全局唯一且自增,如何實現?
  • 最後一個單詞的長度

8.動態規劃

  • 斐波那契數
  • 不同路徑
  • 爬樓梯
  • 零錢兌換
  • 打家劫舍
  • 編輯距離

第二部分

1.數組

  • 請你回答一下Array&List, 數組和鏈表的區別
  • 一組有序數(從小到大排列),有負有正,找出絕對值最小值
  • 數組中重複的數字

2.排序

  • 手寫一下快排的代碼
  • 介紹一下各種排序算法及其複雜度
  • 穩定排序有哪幾種?
  • 請問海量數據如何去取最大的k個
  • 請問快排的時間複雜度最差是多少?什麼時候時間最差

3.動態規劃

  • 手寫代碼:最長公共連續子序列
  • 手寫代碼:求一個字符串最長迴文子串
  • 手寫代碼:求最大子序和

4.鏈表

  • 請你手寫代碼,如何合併兩個有序鏈表
  • 手寫代碼:反轉鏈表
  • 判斷一個鏈表是否爲迴文鏈表,說出你的思路並手寫代碼
  • 請問什麼是單向鏈表,如何判斷兩個單向鏈表是否相交

5.高級算法

  • 什麼是LRU緩存
  • 請你說一說洗牌算法

6.字符串

  • 給你一個字符串,找出第一個不重複的字符,如“abbbabcd”,則第一個不重複就是c
  • 最長公共前綴
  • 有效的字母異位詞

第三部分

1.遞歸&回溯

  • 手寫代碼:兩數相加
  • 手寫代碼:括號生成
  • 手寫代碼:驗證二叉搜索樹
  • 二叉樹的最大深度
  • 二叉樹的最近公共祖先
  • 全排列
  • N皇后

2.並查集

  • 手寫代碼:省份數量
  • 手寫代碼:島嶼數量
  • 手寫代碼:最長連續序列

3.字符串

  • 手寫代碼:轉換成小寫字母
  • 手寫代碼:最長公共前綴
  • 手寫代碼:有效的字母異位詞

我們知道,越是核心越是深層次的技術,會涉及到越來越多的算法、數據結構、編程思想等知識,不管現在的技術及框架更新速度有多快,底層的很多算法跟原理還是萬變不離其宗的。

所以,最終我們還是需要在算法,數據結構,編程思想,計算機原理等方向深耕!!

現在你能明白爲什麼有人會說算法、數據結構決定了程序員的高度了嗎?

也許有很多人不是計算機專業出生,或是培訓機構培訓出來的,沒有學過這些內容,其實即使是科班出生的程序員,在幾年的應用層開發之後,曾經算法、數據結構相關知識也會被淡忘。

最後,有需要這份《2021最新版數據結構與算法面試題手冊》的朋友們,點這裏可以看到全部內容。或者點擊 【這裏】 查看獲取方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章