50+ 精選資料結構和演算法面試問題 【譯】

PeTu發表於2018-10-13

原文連結:hackernoon.com/50-data-str…

譯文原文:pengtuo.tech/algorithms/…

本文的描述語言為 Java

image

有許多電腦科學專業畢業生或者程式猿會申請研發職位,在這個行業裡有很多待遇比較好的大公司,例如國內的BAT,頭條,美團等,國外也有亞馬遜,谷歌以及 Facebook 等大型公司,但他們中的許多人都不知道當你在這些公司申請工作時會遇到什麼樣的程式設計面試問題

在本文中,我將與不同經驗水平的程式猿分享一些常見的程式設計面試問題,涉及從剛從大學畢業的人到具有一到兩年經驗的程式設計師

研發面試主要由 資料結構和基於演算法的問題 組成,也會有一些邏輯性的面試問題,例如 如何在不使用臨時變數的情況下交換兩個整數?

我認為將演算法問題劃分到不同的領域是非常有幫助的。我在面試中經常遇見的領域有陣列、連結串列、字串、二叉樹,還有演算法問題(例如字串演算法問題、排序演算法問題,或者其他),並且這些都會在本文中提及。

我不能保證本文中的資料結構問題或者演算法問題肯定會被問及,但是這些會讓你充分了解實際面試中的遇到的各種問題以及解題思路。

一旦充分學習了這些問題,你應該有足夠的信心參加任何電話面試或者線下面試。

順便說一下,如果你沒有認真學習過基本的資料結構和演算法,或者你沒有多年觸及它們,那麼還是建議你先去補充一下基礎知識,再來研究本文的問題。

Top 50 演算法和程式設計面試問題

話不多說,這裡列出我在研發工作以及面試中一些最常見的演算法面試問題列表:

1. 陣列類面試問題

陣列是最基本的資料結構,它將元素儲存在連續的記憶體位置。這也是面試官很喜歡面試的方向,你會在任何演算法面試中聽到很多關於陣列的問題,例如:反轉陣列,排序陣列或搜尋陣列上的元素。

陣列資料結構最大的優點是當知道索引時能夠在 O(1) 的時間複雜度內搜尋,但是向陣列資料結構裡新增和移除元素時會非常慢,因為陣列一旦建立就不能更改其規格。當需要更改陣列的大小時,則需要建立一個新的陣列,然後從原先的陣列中將元素拷貝到新的陣列中。

解決基於陣列類的演算法問題的關鍵是要充分了解陣列資料結構以及基本的程式設計技能,例如迴圈、遞迴等。

以下列出非常受歡迎的基於陣列類的演算法面試問題供你練習:

  1. 如何在一個給定的,範圍是 1 到 100 的亂序整數陣列中找到缺失的值?solution
  2. 如何在一個給定的整數陣列中找到重複的數字?solution
  3. 如何在一個亂序的整數陣列中找到最大值與最小值?solution
  4. 如何找到所有的整數對,其總和等於給定的數字?solution
  5. 如何在包含多個重複項的陣列中找到重複的數字?solution
  6. 如何用 Java 語言在一個給定的陣列中移除重複項?solution
  7. 請利用快速排序對一個陣列進行原地排序。solution
  8. 如何用 Java 在原地反轉一個陣列?solution
  9. 請了解陣列問題中的對撞指標和滑動視窗技巧

這些問題不僅能夠幫助你提高解決問題的能力,還能更好的幫助你理解陣列這個資料結構。如果你覺得這幾道題不夠聯絡,則可以檢視 30 array question,也可以在 Leetcode或者Lintcode上的陣列標籤下找題目。

2. 連結串列類面試題

連結串列是另一種非常常見的資料結構。與陣列結構類似,連結串列也是線性資料結構並且以線性的方式儲存。

然而,和陣列資料結構不同的是,在記憶體物理位置上資料元素並不是相鄰的,相反,資料是分散儲存在記憶體中,通過節點與其他資料相連。連結串列就是一系列的節點,其中每個節點儲存著資料值和下一個節點的地址。

由於這種結構,在連結串列中新增和刪除元素很容易,因為您只需要更改連結而不是建立陣列,但搜尋很困難,在單連結串列中通常需要花費 O(n) 時間來查詢元素。

連結串列還有其他的變種,例如雙向連結串列,允許在連結串列上兩個方向(向前或向後)遊走;還有迴圈連結串列,連結串列的首尾相連組合成一個圈。

為了解決基於連結串列的問題,需要對遞迴很瞭解,因為連結串列是遞迴資料結構。如果從連結串列中獲取一個節點,則剩餘的資料結構仍然是連結串列,因此,許多連結串列問題具有比迭代解決方案更簡單的遞迴解決方案。

以下列出一些常見的受歡迎的連結串列的面試問題:

  1. 如何遍歷一次就找到連結串列的中間節點?solution
  2. 如何判斷一個連結串列是否有環?如何找到這個環的起始節點?solution
  3. 如何反轉一個連結串列?solution
  4. 如何不使用遞迴的情況下反轉連結串列?solution
  5. 如何從未排序的連結串列中移除重複節點?solution
  6. 請求出一個單連結串列的長度。solution
  7. 如何找出單連結串列的倒數第三個節點?solution
  8. 請對兩個連結串列表示的整數求和,並返回連結串列。solution

這些問題將幫助您提高解決問題的能力,並提高您對連結串列資料結構的瞭解。如果對於以上這些問題感覺比較吃力,建議先補充連結串列的基礎知識。你也可以聯絡30 linked list interview questions

3. 字串類面試問題

與陣列和連結串列資料結構同樣,字串型別是面試中的另一個熱門話題。關於字串問題的好訊息是,如果你懂陣列,你可以很容易地解決基於字串的問題,因為字串只是一個字元陣列。

所以所有你的基於陣列類問題的解題思路與技巧都可以用來解決字串型別的問題。

以下是我列出的在工作面試中會被頻繁問及的字串型別問題:

  1. 如何將字串中重複的字元列印出來?solution
  2. 如何判斷兩個亂序的字串中的字母都相同?solution
  3. 請將字串中第一個未重複的字元列印出來。solution
  4. 如何利用遞迴翻轉一個字串?solution
  5. 如何判斷一個字串中只包含數字字元?solution
  6. 請統計一個字串中的母音和子音的個數。solution
  7. 如何計算字串中給定字元的出現次數?solution
  8. 請輸出給定字串的所有排列組合。solution
  9. 如何翻轉給定句子中的單詞?solution
  10. 如何判斷兩個字串互為旋轉?solution
  11. 如何判斷一個字元是迴文字元?solution

這些問題有助於提高您對字串作為資料結構的瞭解。 如果你可以在沒有任何幫助的情況下解決所有這些String問題,那麼你很棒棒。

如果你需要更多的練習,可以看這裡

4. 二叉樹面試問題

到目前為止,我們只研究了線性資料結構,但現實世界中的所有資訊都無法以線性方式表示,而這正是樹資料結構所幫助的地方。

樹資料結構是一種資料結構,允許以分層方式儲存資料。 根據儲存資料的方式,有不同型別的樹,例如二叉樹,其每個節點最多有兩個子節點。以及其近親,二叉搜尋樹,這個是最受歡迎的樹形資料結構了。因此你會發現有很多的面試問題都是基於二叉樹和二叉搜尋樹,例如 如何遍歷,計算節點個數,找到樹深度或者判斷其是否為平衡樹等。

解決二叉樹問題的一個關鍵點是需要很紮實的理論基礎,例如: 什麼是二叉樹的大小或深度,什麼是葉子,什麼是節點,以及對流行的遍歷演算法的理解,例如前中後序遍歷。

以下是流行的基於二叉樹的面試問題列表:

  1. 如何實現二叉搜尋樹?solution
  2. 請前序遍歷一顆二叉樹。solution
  3. 請不使用遞迴的情況下前序遍歷一顆二叉樹。solution
  4. 請中序遍歷一顆二叉樹。solution
  5. 請在不使用遞迴的情況下中序遍歷一顆二叉樹並輸出。solution
  6. 如何實現後序遍歷演算法?solution
  7. 請在不使用遞迴的情況下後序遍歷一顆二叉樹。solution
  8. 如何輸出一顆二叉搜尋樹的所有葉子結點?solution
  9. 如何統計一顆二叉樹的所有葉子節點的個數。solution
  10. 如何在一個陣列中執行二分搜尋。solution

5. 各式面試問題

除了基於資料結構的問題之外,大多數面試中還會詢問演算法,設計,位操作和基於邏輯的一般問題,我將在本節中對其進行描述。

  1. 如何實現氣泡排序?solution
  2. 如何實現迭代快速排序演算法?solution
  3. 如何實現插入排序演算法?solution
  4. 如何實現歸併排序演算法?solution
  5. 如何實現桶排序演算法?solution
  6. 如何實現計數排序演算法?solution
  7. 如何實現基數排序演算法?solution
  8. 如何在不使用第三個變數的情況下交換兩個數字?solution
  9. 如何判斷兩個矩形是否互相重疊?solution
  10. 如何設計自動售貨機?solution

順便說一下,你在實踐中解決的問題越多,你的準備就越好。 因此,如果您認為 50 還不夠而且您需要更多,那麼請檢視這些額外的50個程式設計問題,以便進行更全面的準備。

現在,你應該準備好了

這些是資料結構和演算法之外的一些最常見的問題,可以幫助您在面試中做得很好。這些常見的資料結構和演算法問題是您在任何級別的技術面試都需要了解的問題。

如果您正在尋找開發工作,您可以使用此這些問題列表開始準備。此列表提供了準備的好主題,也有助於評估您的準備工作,以找出您的優勢和劣勢領域。熟悉資料結構和演算法對於面試成功非常重要。

譯者:歡迎大家訪問我的個人部落格與留言 pengtuo.tech

相關文章