【程序猿必備】數據結構與算法精選面試題

摘要:程序員換工做,沒有這些面試題怎麼找?

clipboard.png

有不少計算機科學技術專業的畢業生和程序員申請在Uber和Netflix這樣的初創公司、谷歌和阿里巴巴這樣的大公司以及Infosys或Luxsoft等以服務爲基礎的公司從事編程、編碼和軟件開發工做,但他們中的許多人都不知道,當你申請這些公司的職位時,你會遇到什麼樣的編程面試問題。程序員

在這篇文章中,我將分享一些常見的來自不一樣經驗水平程序員的編程面試問題,他們是從剛大學畢業的人到有一到兩年經驗的程序員。面試

編程面試主要由數據結構問題和算法問題以及一些邏輯問題組成,好比,如何在不使用臨時變量的狀況下交換兩個整數?算法

我認爲把編程面試問題分紅不一樣的主題領域是有幫助的。我在訪談中常常看到的主題領域是數組、鏈表、字符串、二叉樹,以及來自算法的問題(例如字符串算法、快速排序或基數排序等排序算法),這就是你將在本文中找到的內容。編程

這些面試題不能保證你會被問到這些編程、數據結構和算法問題,但它們會讓你對在真正的編程工做面試中可能遇到的問題有足夠的瞭解。數組

一旦你完成這些問題,你就應該有足夠的信心參加任何電話或面對面的面試。數據結構

順便說一句,若是你對基本的數據結構和算法沒有充分的知識,或者從沒有接觸過它們,那麼嘗試這些問題就沒有意義了。數據結構和算法

在這種狀況下,你應該學習一門很好的課程,好比Robert Horvick的算法和數據結構第1部分和第2部分,以更新你的DS和算法技能。函數

前50大算法和編碼面試問題

下面是我列出的一些最多見的編程面試問題:學習

1.數組編碼面試問題

數組是最基本的數據結構,它將元素存儲在一個連續的內存位置。這也是面試官們熱衷的話題之一,在任何一次編程面試中,你都會聽到不少關於數組的問題,好比將數組中元素位置顛倒,對數組進行排序,或者搜索數組上的元素。編碼

數組數據結構的主要優勢是,若是知道索引,它能夠提供快速的O(1)搜索,可是從數組中添加和刪除元素是很慢的,由於一旦建立了數組,就沒法更改數組的大小。

爲了建立更小或更大的數組,須要建立一個新數組並將全部元素從舊數組拷貝到新數組。

解決基於數組的問題的關鍵是對數組數據結構以及基本的編程構造函數(如循環、遞歸和基本運算符)要有很好的瞭解。

如下是一些熱門的基於數組的編程面試問題:

1.如何在一個1到100的整數數組中找到丟失的數字?(方法)

2.如何在給定的整數數組中找到重複的數字? (方法)

3.如何在未排序整數數組中找到最大值和最小值? (方法)

4.如何找到數組全部和等於一個給定數的數對? (方法)

5.若是一個數組包含多重複制,那麼如何找到重複的數字? (方法)

6.在Java中如何從給定數組中刪除多重複制? (方法)

7.如何使用快速排序算法對整數數組進行排序? (方法)

8.如何從數組中刪除多重複制? (方法)

9.如何在Java中對數組進行反向操做? (方法)

10.如何在不使用任何庫的狀況下從數組中刪除多重複制? (方法)

這些問題不只能夠幫助你提升解決問題的能力,還能夠提升你對數組數據結構的認識。

若是你須要更高級的基於數組的問題,那麼你還能夠看到編程面試訓練營:算法+數據結構,一個專門爲面試準備的關於算法的Bootcamp風格課程,以得到一個技術巨頭公司的工做,如谷歌,微軟,蘋果,Facebook等。

clipboard.png

若是你以爲10個問題不夠用來訓練,或者你須要更多的訓練,你能夠看一下這30題。

2.鏈表編程面試問題

鏈表是補充數組數據結構的另外一種常見的數據結構。與數組相似,它也是一個線性數據結構,以線性方式存儲元素。

然而,與數組不一樣的是,它不會將它們存儲在連續的位置;相反,它們分散在內存中各處,內存使用節點相互鏈接。

鏈表就是節點列表,每一個節點包含存儲的值和下一個節點的地址。

因爲這種結構,在鏈表中添加和刪除元素很容易,由於只須要更改連接而不是建立數組,可是查找是困難的,而且一般須要O(n)來查找單個鏈表中的元素。

本文提供了更多關於數組和鏈表數據結構之間區別的信息。

鏈表也有多種形式,好比單鏈表,它容許你沿着一個方向(向前或向後)移動遍歷;雙鏈表,容許在兩個方向(向前和向後)遍歷;最後,循環鏈表則造成一個環。

爲了解決基於鏈表的問題,對遞歸知識進行了解是很重要的,由於鏈表是遞歸數據結構。

若是從鏈表中取出一個節點,剩下的數據結構仍然是鏈表,所以,許多鏈表問題的遞歸解決方案比迭代解決方案更簡單。

如下是一些最多見和最流行的面試問題及解決方法:

1.如何在一次遍歷中找到單個鏈表的中值?(方法)

2.如何證實給定的鏈表是否包含循環?如何找到循環的頭節點? (方法)

3.如何使鏈表反向? (方法)

4.如何在不使用遞歸的狀況下逆轉單鏈表? (方法)

5.如何刪除未排序鏈表中的重複節點? (方法)

6.如何獲得單鏈表的長度?(方法)

7.如何在單鏈表中從尾部找到第三個節點? (方法)

8.如何使用堆棧獲得兩個鏈表的和? (方法)

這些問題將幫助你發展解決問題的技能,以及提升你對鏈表數據結構的知識。

若是你在解決這些鏈表編程問題時遇到困難,那麼我建議你經過瀏覽數據結構和算法來刷新數據結構和算法技能:使用Java課程進行深刻研究。

clipboard.png

你能夠看這30題得到更多的練習。

3.字符串編程面試問題

除了數組和鏈表數據結構外,字符串也是編程面試中的另外一個熱門話題。我參加過的面試,都有以字符串爲基礎的問題。

字符串的一個好處是,若是你瞭解數組,你能夠很容易地解決基於字符串的問題,由於字符串是一個字符數組。

所以,經過解決基於數組的編程問題所學習的全部技術也能夠用於解決字符串編程問題。

下面是編程面試中常常被問到的字符串編碼問題:

1.如何從字符串打印重複字符?(方法)

2.如何檢查兩個字符串是否互相顛倒? (方法)

3.如何從字符串中打印第一個非重複字符? (方法)

4.如何使用遞歸反轉給定的字符串? (方法)

5.如何檢查字符串是否只包含數字? (方法)

6.如何在字符串中找到重複的字符? (方法)

7.在給定的字符串中,如何計算元音和輔音的數量? (方法)

8.如何計算字符串中給定字符的出現次數? (方法)

9.如何找到一個字符串的全部排列? (方法)

10.如何在不使用任何庫方法的狀況下逆轉一個句子中的單詞?(方法)

11.如何檢查兩個字符串是否互相旋轉?(方法)

12.如何檢查給定的字符串是否迴文?(方法)

這些問題有助於提升對字符串數據結構的認識。若是你能在沒有任何幫助的狀況下解決全部這些問題,那麼你應該不錯。

對於更高級的問題,我建議解決Steven Skiena的算法設計手冊中給出的問題,這本書中有最棘手的算法問題。

clipboard.png

若是你須要更多的練習,這裏有另一個20個字符串編碼問題的列表。

4.二叉樹編碼面試問題

到目前爲止,咱們只研究了線性數據結構,可是現實世界中的全部信息都不能以線性方式表示,這就是樹數據結構的做用所在。

樹數據結構是一種容許以分層方式存儲數據的數據結構。根據存儲數據的方式的不一樣,樹的類型不一樣,例如二叉樹,其中每一個節點最多有兩個子節點。

除了近親二叉搜索樹,它也是最流行的樹數據結構之一。所以,會有許多基於它們的問題,例如如何遍歷它們、計算節點、查找深度以及檢查它們是否爲平衡二叉樹。

解決二叉樹問題的一個關鍵是要有很強的理論知識,例如二叉樹的大小或深度是什麼,什麼是葉子節點,什麼是節點,以及理解流行的遍歷算法,例如先序遍歷、後序遍歷和順序遍歷。

下面是一些軟件工程師或開發人員面試中常見的基於二進制樹的編碼問題:

1.如何實現二叉搜索樹?(方法)

2.如何在給定的二叉樹中執行先序遍歷? (方法)

3.如何在不使用遞歸的狀況下按順序遍歷給定的二叉樹? (方法)

4.如何在給定的二叉樹中執行順序遍歷? (方法)

5.如何在不使用遞歸的狀況下,使用順序遍歷打印給定二叉樹的全部節點? (方法)

6.如何實現後序遍歷算法? (方法)

7.如何在不使用遞歸的狀況下遍歷後序遍歷中的二叉樹? (方法)

8.如何打印二叉搜索樹的全部葉子? (方法)

9.如何計算給定二叉樹中的葉節點數? (方法)

10.如何在給定數組中執行二分法搜索?(方法)

若是你以爲對二叉樹編碼的理解不夠充分,並且你不能本身解決這些問題,我建議你回去選擇一個好的數據結構和算法課程,好比從0到1:Java中的數據結構和算法。

clipboard.png

若是你須要更多的推薦,這裏是個人數據結構算法書籍和課程列表。

5.其餘編碼面試問題

除了基於數據結構的問題,大多數編程工做面試也會問算法、設計、位操做和基於邏輯的問題,我將在本節中描述這些問題。

練習這些概念是很重要的,由於有時候這些概念在實際面試中很難解決。以前的練習不只讓你熟悉它們,也讓你在向面試官解釋解決方案時更有信心。

1.如何實現冒泡排序算法?(方法)

2.如何實現迭代快速排序算法?(方法)

3.如何實現插入排序算法?(方法)

4.如何實現歸併排序算法?(方法)

5.如何實現桶排序算法?(方法)

6.如何實現計數排序算法?(方法)

7.如何實現基數排序算法?(方法)

8.如何在不使用第三個變量的狀況下交換兩個數字?(方法)

9.如何檢查兩個矩形是否重疊?(方法)

10.如何設計自動售貨機?(方法)

若是你須要更多這樣的編程問題,你能夠從Gayle Laakmann McDowell的著做《破解代碼面試》中獲得幫助,該書提出了189個以上的編程問題和解決方案。一本能夠在短期內爲編程面試作準備的好書。

clipboard.png

順便說一下,你在實踐中解決的問題越多,你準備的就越好。因此,若是你認爲50題還不夠,你還須要更多,那麼你能夠看看這些額外的50題電話面試的編程問題,以及這些書籍和課程,以便更完全的準備。

如今你已經爲編碼面試作好了準備

這些是數據結構和算法以外的一些最多見的問題,能夠幫助你在面試中表現出色。這些常見的編碼、數據結構和算法問題是在任何級別的編程工做中成功面試任何公司(不管大小)所須要知道的。

若是你想在2018年找一份編程或軟件開發的工做,你能夠從這些編碼問題開始準備。

這份清單提供了很好的準備主題,也有助於評估你的準備工做,找出你的優點和劣勢。良好的數據結構和算法知識對於編碼面試的成功是很重要的,這也是你應該集中注意力的地方。

本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索