【程序猿必备】数据结构与算法精选面试题
有很多計算機科學技術(shù)專業(yè)的畢業(yè)生和程序員申請在Uber和Netflix這樣的初創(chuàng)公司、谷歌和阿里巴巴這樣的大公司以及Infosys或Luxsoft等以服務(wù)為基礎(chǔ)的公司從事編程、編碼和軟件開發(fā)工作,但他們中的許多人都不知道,當你申請這些公司的職位時,你會遇到什么樣的編程面試問題。
在這篇文章中,我將分享一些常見的來自不同經(jīng)驗水平程序員的編程面試問題,他們是從剛大學畢業(yè)的人到有一到兩年經(jīng)驗的程序員。
編程面試主要由數(shù)據(jù)結(jié)構(gòu)問題和算法問題以及一些邏輯問題組成,比如,如何在不使用臨時變量的情況下交換兩個整數(shù)?
我認為把編程面試問題分成不同的主題領(lǐng)域是有幫助的。我在訪談中經(jīng)常看到的主題領(lǐng)域是數(shù)組、鏈表、字符串、二叉樹,以及來自算法的問題(例如字符串算法、快速排序或基數(shù)排序等排序算法),這就是你將在本文中找到的內(nèi)容。
這些面試題不能保證你會被問到這些編程、數(shù)據(jù)結(jié)構(gòu)和算法問題,但它們會讓你對在真正的編程工作面試中可能遇到的問題有足夠的了解。
一旦你完成這些問題,你就應(yīng)該有足夠的信心參加任何電話或面對面的面試。
順便說一句,如果你對基本的數(shù)據(jù)結(jié)構(gòu)和算法沒有充分的知識,或者從沒有接觸過它們,那么嘗試這些問題就沒有意義了。
在這種情況下,你應(yīng)該學習一門很好的課程,比如Robert Horvick的算法和數(shù)據(jù)結(jié)構(gòu)第1部分和第2部分,以更新你的DS和算法技能。
前50大算法和編碼面試問題
下面是我列出的一些最常見的編程面試問題:
1.數(shù)組編碼面試問題
數(shù)組是最基本的數(shù)據(jù)結(jié)構(gòu),它將元素存儲在一個連續(xù)的內(nèi)存位置。這也是面試官們熱衷的話題之一,在任何一次編程面試中,你都會聽到很多關(guān)于數(shù)組的問題,比如將數(shù)組中元素位置顛倒,對數(shù)組進行排序,或者搜索數(shù)組上的元素。
數(shù)組數(shù)據(jù)結(jié)構(gòu)的主要優(yōu)點是,如果知道索引,它可以提供快速的O(1)搜索,但是從數(shù)組中添加和刪除元素是很慢的,因為一旦創(chuàng)建了數(shù)組,就無法更改數(shù)組的大小。
為了創(chuàng)建更小或更大的數(shù)組,需要創(chuàng)建一個新數(shù)組并將所有元素從舊數(shù)組拷貝到新數(shù)組。
解決基于數(shù)組的問題的關(guān)鍵是對數(shù)組數(shù)據(jù)結(jié)構(gòu)以及基本的編程構(gòu)造函數(shù)(如循環(huán)、遞歸和基本運算符)要有很好的了解。
以下是一些熱門的基于數(shù)組的編程面試問題:
1.如何在一個1到100的整數(shù)數(shù)組中找到丟失的數(shù)字?(方法)
2.如何在給定的整數(shù)數(shù)組中找到重復(fù)的數(shù)字??(方法)
3.如何在未排序整數(shù)數(shù)組中找到最大值和最小值??(方法)
4.如何找到數(shù)組所有和等于一個給定數(shù)的數(shù)對??(方法)
5.如果一個數(shù)組包含多重復(fù)制,那么如何找到重復(fù)的數(shù)字??(方法)
6.在Java中如何從給定數(shù)組中刪除多重復(fù)制??(方法)
7.如何使用快速排序算法對整數(shù)數(shù)組進行排序??(方法)
8.如何從數(shù)組中刪除多重復(fù)制??(方法)
9.如何在Java中對數(shù)組進行反向操作??(方法)
10.如何在不使用任何庫的情況下從數(shù)組中刪除多重復(fù)制??(方法)
這些問題不僅可以幫助你提高解決問題的能力,還可以提高你對數(shù)組數(shù)據(jù)結(jié)構(gòu)的認識。
如果你需要更高級的基于數(shù)組的問題,那么你還可以看到編程面試訓(xùn)練營:算法+數(shù)據(jù)結(jié)構(gòu),一個專門為面試準備的關(guān)于算法的Bootcamp風格課程,以獲得一個技術(shù)巨頭公司的工作,如谷歌,微軟,蘋果,Facebook等。
如果你覺得10個問題不夠用來訓(xùn)練,或者你需要更多的訓(xùn)練,你可以看一下這30題。
2.鏈表編程面試問題
鏈表是補充數(shù)組數(shù)據(jù)結(jié)構(gòu)的另一種常見的數(shù)據(jù)結(jié)構(gòu)。與數(shù)組類似,它也是一個線性數(shù)據(jù)結(jié)構(gòu),以線性方式存儲元素。
然而,與數(shù)組不同的是,它不會將它們存儲在連續(xù)的位置;相反,它們分散在內(nèi)存中各處,內(nèi)存使用節(jié)點相互連接。
鏈表就是節(jié)點列表,每個節(jié)點包含存儲的值和下一個節(jié)點的地址。
由于這種結(jié)構(gòu),在鏈表中添加和刪除元素很容易,因為只需要更改鏈接而不是創(chuàng)建數(shù)組,但是查找是困難的,并且通常需要O(n)來查找單個鏈表中的元素。
本文提供了更多關(guān)于數(shù)組和鏈表數(shù)據(jù)結(jié)構(gòu)之間區(qū)別的信息。
鏈表也有多種形式,比如單鏈表,它允許你沿著一個方向(向前或向后)移動遍歷;雙鏈表,允許在兩個方向(向前和向后)遍歷;最后,循環(huán)鏈表則形成一個環(huán)。
為了解決基于鏈表的問題,對遞歸知識進行了解是很重要的,因為鏈表是遞歸數(shù)據(jù)結(jié)構(gòu)。
如果從鏈表中取出一個節(jié)點,剩下的數(shù)據(jù)結(jié)構(gòu)仍然是鏈表,因此,許多鏈表問題的遞歸解決方案比迭代解決方案更簡單。
以下是一些最常見和最流行的面試問題及解決方法:
1.如何在一次遍歷中找到單個鏈表的中值?(方法)
2.如何證明給定的鏈表是否包含循環(huán)?如何找到循環(huán)的頭節(jié)點??(方法)
3.如何使鏈表反向??(方法)
4.如何在不使用遞歸的情況下逆轉(zhuǎn)單鏈表??(方法)
5.如何刪除未排序鏈表中的重復(fù)節(jié)點??(方法)
6.如何得到單鏈表的長度?(方法)
7.如何在單鏈表中從尾部找到第三個節(jié)點??(方法)
8.如何使用堆棧得到兩個鏈表的和??(方法)
這些問題將幫助你發(fā)展解決問題的技能,以及提高你對鏈表數(shù)據(jù)結(jié)構(gòu)的知識。
如果你在解決這些鏈表編程問題時遇到困難,那么我建議你通過瀏覽數(shù)據(jù)結(jié)構(gòu)和算法來刷新數(shù)據(jù)結(jié)構(gòu)和算法技能:使用Java課程進行深入研究。
你可以看這30題獲得更多的練習。
?
3.字符串編程面試問題
除了數(shù)組和鏈表數(shù)據(jù)結(jié)構(gòu)外,字符串也是編程面試中的另一個熱門話題。我參加過的面試,都有以字符串為基礎(chǔ)的問題。
字符串的一個好處是,如果你了解數(shù)組,你可以很容易地解決基于字符串的問題,因為字符串是一個字符數(shù)組。
因此,通過解決基于數(shù)組的編程問題所學習的所有技術(shù)也可以用于解決字符串編程問題。
下面是編程面試中經(jīng)常被問到的字符串編碼問題:
1.如何從字符串打印重復(fù)字符?(方法)
2.如何檢查兩個字符串是否互相顛倒??(方法)
3.如何從字符串中打印第一個非重復(fù)字符??(方法)
4.如何使用遞歸反轉(zhuǎn)給定的字符串??(方法)
5.如何檢查字符串是否只包含數(shù)字??(方法)
6.如何在字符串中找到重復(fù)的字符??(方法)
7.在給定的字符串中,如何計算元音和輔音的數(shù)量??(方法)
8.如何計算字符串中給定字符的出現(xiàn)次數(shù)??(方法)
9.如何找到一個字符串的所有排列??(方法)
10.如何在不使用任何庫方法的情況下逆轉(zhuǎn)一個句子中的單詞?(方法)
11.如何檢查兩個字符串是否互相旋轉(zhuǎn)?(方法)
12.如何檢查給定的字符串是否回文?(方法)
這些問題有助于提高對字符串數(shù)據(jù)結(jié)構(gòu)的認識。如果你能在沒有任何幫助的情況下解決所有這些問題,那么你應(yīng)該不錯。
對于更高級的問題,我建議解決Steven Skiena的算法設(shè)計手冊中給出的問題,這本書中有最棘手的算法問題。
如果你需要更多的練習,這里有另外一個20個字符串編碼問題的列表。
4二叉樹編碼面試問題
到目前為止,我們只研究了線性數(shù)據(jù)結(jié)構(gòu),但是現(xiàn)實世界中的所有信息都不能以線性方式表示,這就是樹數(shù)據(jù)結(jié)構(gòu)的作用所在。
樹數(shù)據(jù)結(jié)構(gòu)是一種允許以分層方式存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。根據(jù)存儲數(shù)據(jù)的方式的不同,樹的類型不同,例如二叉樹,其中每個節(jié)點最多有兩個子節(jié)點。
除了近親二叉搜索樹,它也是最流行的樹數(shù)據(jù)結(jié)構(gòu)之一。因此,會有許多基于它們的問題,例如如何遍歷它們、計算節(jié)點、查找深度以及檢查它們是否為平衡二叉樹。
解決二叉樹問題的一個關(guān)鍵是要有很強的理論知識,例如二叉樹的大小或深度是什么,什么是葉子節(jié)點,什么是節(jié)點,以及理解流行的遍歷算法,例如先序遍歷、后序遍歷和順序遍歷。
下面是一些軟件工程師或開發(fā)人員面試中常見的基于二進制樹的編碼問題:
1.如何實現(xiàn)二叉搜索樹?(方法)
2.如何在給定的二叉樹中執(zhí)行先序遍歷??(方法)
3.如何在不使用遞歸的情況下按順序遍歷給定的二叉樹??(方法)
4.如何在給定的二叉樹中執(zhí)行順序遍歷??(方法)
5.如何在不使用遞歸的情況下,使用順序遍歷打印給定二叉樹的所有節(jié)點??(方法)
6.如何實現(xiàn)后序遍歷算法??(方法)
7.如何在不使用遞歸的情況下遍歷后序遍歷中的二叉樹??(方法)
8.如何打印二叉搜索樹的所有葉子??(方法)
9.如何計算給定二叉樹中的葉節(jié)點數(shù)??(方法)
10.如何在給定數(shù)組中執(zhí)行二分法搜索?(方法)
如果你覺得對二叉樹編碼的理解不夠充分,而且你不能自己解決這些問題,我建議你回去選擇一個好的數(shù)據(jù)結(jié)構(gòu)和算法課程,比如從0到1:Java中的數(shù)據(jù)結(jié)構(gòu)和算法。
如果你需要更多的推薦,這里是我的數(shù)據(jù)結(jié)構(gòu)算法書籍和課程列表。
5.其他編碼面試問題
除了基于數(shù)據(jù)結(jié)構(gòu)的問題,大多數(shù)編程工作面試也會問算法、設(shè)計、位操作和基于邏輯的問題,我將在本節(jié)中描述這些問題。
練習這些概念是很重要的,因為有時候這些概念在實際面試中很難解決。之前的練習不僅讓你熟悉它們,也讓你在向面試官解釋解決方案時更有信心。
1.如何實現(xiàn)冒泡排序算法?(方法)
2.如何實現(xiàn)迭代快速排序算法?(方法)
3.如何實現(xiàn)插入排序算法?(方法)
4.如何實現(xiàn)歸并排序算法?(方法)
5.如何實現(xiàn)桶排序算法?(方法)
6.如何實現(xiàn)計數(shù)排序算法?(方法)
7.如何實現(xiàn)基數(shù)排序算法?(方法)
8.如何在不使用第三個變量的情況下交換兩個數(shù)字?(方法)
9.如何檢查兩個矩形是否重疊?(方法)
10.如何設(shè)計自動售貨機?(方法)
如果你需要更多這樣的編程問題,你可以從Gayle Laakmann McDowell的著作《破解代碼面試》中得到幫助,該書提出了189個以上的編程問題和解決方案。一本可以在短時間內(nèi)為編程面試做準備的好書。
順便說一下,你在實踐中解決的問題越多,你準備的就越好。所以,如果你認為50題還不夠,你還需要更多,那么你可以看看這些額外的50題電話面試的編程問題,以及這些書籍和課程,以便更徹底的準備。
現(xiàn)在你已經(jīng)為編碼面試做好了準備
這些是數(shù)據(jù)結(jié)構(gòu)和算法之外的一些最常見的問題,可以幫助你在面試中表現(xiàn)出色。這些常見的編碼、數(shù)據(jù)結(jié)構(gòu)和算法問題是在任何級別的編程工作中成功面試任何公司(無論大小)所需要知道的。
如果你想在2018年找一份編程或軟件開發(fā)的工作,你可以從這些編碼問題開始準備。
這份清單提供了很好的準備主題,也有助于評估你的準備工作,找出你的優(yōu)勢和劣勢。良好的數(shù)據(jù)結(jié)構(gòu)和算法知識對于編碼面試的成功是很重要的,這也是你應(yīng)該集中注意力的地方。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的【程序猿必备】数据结构与算法精选面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MaxCompute 多租户数据安全体系
- 下一篇: 数据科学指南