程序員必須掌握哪些算法?附“互聯網公司最常見的算法面試題”

程序員必須掌握哪些算法?附“互聯網公司最常見的算法面試題”

春招在即,不知道小夥伴們為面試準備得怎麼樣啦?

力扣 (LeetCode) 在此特地為大家整理了一些程序員在 面試中 需要掌握的算法,熟練掌握它們可以幫你在面試中如虎添翼,百戰百勝。

01 算法與數據結構

算法與數據結構是面試考察的重中之重,也是同學們日後刷題時需要著重訓練的部分。簡單的總結一下,大約有這些內容:

算法 - Algorithms

  1. 排序算法:快速排序、歸併排序、計數排序
  2. 搜索算法:回溯、遞歸、剪枝技巧
  3. 圖論:最短路、最小生成樹、網絡流建模
  4. 動態規劃:揹包問題、最長子序列、計數問題
  5. 基礎技巧:分治、倍增、二分、貪心

數據結構 - Data Structures

  1. 數組與鏈表:單 / 雙向鏈表、跳舞鏈
  2. 棧與隊列
  3. 樹與圖:最近公共祖先、並查集
  4. 哈希表
  5. 堆:大 / 小根堆、可並堆
  6. 字符串:字典樹、後綴樹


02 經典面試題目

此外,我們還為大家整理了一些互聯網公司面試常見的 算法題目

首先,讓我們回顧幾個有意思的經典互聯網公司的面試題目,熱熱身。

一、給你一個長度為 n 的數組,其中只有一個數字出現了奇數次,其他均出現偶數次,問如何使用優秀的時空複雜度快速找到這個數字。

136. 只出現一次的數字

二、給你一個長度為 n 的數組,其中只有一個數字出現了大於等於 n/2 次,問如何使用優秀的時空複雜度快速找到這個數字。

169. 求眾數

三、給你一個 n*m 的二維數組,每行元素保證遞增,每列元素保證遞增,試問如何使用優秀的時間複雜度找到某個數字(或者判斷不存在)。

240. 搜索二維矩陣 II

四、給你兩顆二叉搜索樹,如何使用線性的時間複雜度,將它們合併成一顆二叉搜索樹。

88.合併兩個有序數組

五、假設有 100 層的高樓,給你兩個完全一樣的雞蛋。請你設計一種方法,能夠試出來從第幾層樓開始往下扔雞蛋,雞蛋會碎。當然,這個問題還有推廣版本,有興趣的同學可以思考一下。假設有 n 層樓,給你 k 個完全一樣的雞蛋,請問最壞情況下,至少需要試驗多少次才能知道從第幾層樓開始往下扔雞蛋,雞蛋會碎。

887. 雞蛋掉落

乾貨預警!

力扣(LeetCode) 將 Top Interview Questions 按照類別進行了整理,以供大家按模塊練習。

詳情請到力扣官網 “2018年力扣高頻算法面試題彙總” 探索卡片進行專項練習。

程序員必須掌握哪些算法?附“互聯網公司最常見的算法面試題”


03 面試題型彙總

作為在電話 / 現場面試中短短不到一個小時時間內,提供給面試者白板編程解決的算法題目,它與筆試上機、編程競賽中的題目在難度與形式上還是有一些不同的。

這裡有一張互聯網公司面試中經常考察的問題類型總結的思維導圖,我們可以結合圖片中的信息分析一下。

程序員必須掌握哪些算法?附“互聯網公司最常見的算法面試題”

可以明確的一點是,面試算法題目在難度上(尤其是代碼難度上)會略低一些,傾向於考察一些基礎數據結構與算法,對於高級算法和奇技淫巧一般不作考察。

代碼題主要考察編程語言的應用是否熟練,基礎是否紮實,一般來會讓面試者寫出代碼完成一些簡單的需求或者使用遞歸實現某些功能,而數學題傾向於考察概率相關的問題。以上這兩類問題,出現的頻率不會很高,即使出現了也應該是面試中的簡單部分,相信一定難不倒在座的各位同學們。

04 算法的重要性

如果不談面試的需求,對於程序員來說上面提到的那些算法依然非常重要,可以說上述內容都是 作為一個程序員必須掌握的算法

有人可能會覺得,這些基礎的算法在工作中完全用不到,安安靜靜地做一個 CRUD Boy 多好。

其實不然,雖然同是程序員,程序員之間也是可以分出個三六九等的。一名出色的程序員一定是熟練掌握各種算法的。紮實地理解與掌握這些基礎算法,能幫助你收穫更強的競爭力,在自己的崗位上快速晉升。

那熟練掌握這些算法,到底可以為身為程序員的我們帶來什麼呢?

提升代碼效率

比如,現在讓你實現這樣一個功能:給你一些有序的數字,動態地查找目標數字。實現這一功能的方法有很多種,當面臨不同情況的時候,我們需要使用不同的方法。

  1. 查找頻率很低時,對於每一次查詢,暴力從前向後遍歷,每次查詢的複雜度為 O(N),能解決問題。
  2. 當查找頻率很高時,對有序數字使用二分查找,每次查詢複雜度為 O(logN)。或者使用哈希表,每次查詢的複雜度為 O(1)。
  3. 如果數字非常多存不進內存裡,可以使用 B樹 的思路來優化查詢。
  4. 當引入密集的插入操作,查詢不太密集的時候,可以使用 LSM樹 的思想完成這一功能。

如果你熟知各種基礎算法,那麼你就可以很容易地針對不同的場景找到合適的解決方案,並且將它們變成代碼,以提升程序的效率。而不是遇事不決,先上暴力,雖然解決了問題,但是在時間與空間上還有很多不足。

提升能力、借鑑思路、獲得啟發

通過學習這些算法,可以提升我們在計算機方面的能力:抽象建模能力、邏輯思維能力等,並且積累一些解決問題的基本思路:折半、倍增、貪心、分治等。

現實中的問題都大相徑庭,但是我們通過將其抽象並建模之後,會發現問題的本質是相似的,我們往往可能從某一個基礎算法中獲得啟發,從而高效地解決問題。而達到這一境界,就要求我們首先對基礎算法能非常瞭解,並達到熟練運用,融會貫通的地步。

所以,即使過了公司面試這一關,算法對於程序員來說依然是非常重要的。熟練掌握算法,將是你職場晉升路上的一把利刃。

最後,力扣祝大家刷題開心,拿到Dream Offer!

本文作者:力扣

聲明:本文歸 “力扣” 版權所有,如需轉載請聯繫。

相關推薦

推薦中...