自hackernoon,作者:javinpaul,機器之心編譯,機器之心編輯部。
同學,你會手寫二叉樹嗎?近來正值秋招季節(jié),很多編程面試都要求手寫數(shù)據(jù)結構手推機器學習算法。各位同學為了面試也會刷各種編程題,其中數(shù)據(jù)結構與排序搜索算法又是最為基礎的內(nèi)容。在本文中,我們?yōu)楦魑蛔x者準備了 48 道基礎面試題,它可以幫助我們更深地理解數(shù)據(jù)結構。本文所有面試題都提供了 Java 解決方案,并介紹了比較流行的 GitHub 面試題項目。
很多計算機科學專業(yè)畢業(yè)生和程序員都會去滴滴出行、這樣的獨角獸公司,或者亞馬遜、微軟和谷歌這樣的科技巨頭申請編程和軟件開發(fā)職位。你在申請這些工作時,肯定很想知道面試官會問到哪些問題。
在本文中,作者會分享一些常見的編程面試問題,這些問題來自于針對不同經(jīng)驗層次的程序員的面試——從應屆畢業(yè)生到具有一兩年經(jīng)驗的程序員。
編程面試題通常包含數(shù)據(jù)結構和基于算法的問題,以及一些邏輯問題,例如:如何在不使用臨時變量的情況下交換兩個整數(shù)?
為了清晰,編程面試題需要劃分為不同主題。我們在面試中經(jīng)??吹降念I域是數(shù)組、鏈表、字符串、二叉樹以及有關算法的問題(例如字符串算法、快速排序或基數(shù)排序等排序算法),本文將介紹這些內(nèi)容。
雖然本文無法覆蓋你在面試中將要面臨的所有問題,但是它可以給你提供足夠的思路,讓你在面試時對于各種挑戰(zhàn)有所準備。
一旦解決了這些問題,你就可以有信心面對任何電話面試或現(xiàn)場面試了。
當然,如果你對于基本數(shù)據(jù)結構和算法沒有足夠的知識儲備,那么直接接觸以下問題將對你沒有幫助。
算法和編程面試題 TOP 48
廢話少說,這里有一份「編程面試最常見的問題列表」:
1. 數(shù)組編程面試問題
數(shù)組是最基本的數(shù)據(jù)結構,它將元素儲存在連續(xù)的內(nèi)存空間中。數(shù)組也是面試官最喜歡問的主題之一,在任何編程面試中都能聽到非常多關于數(shù)組的問題,例如反轉數(shù)組、排序數(shù)組或搜索數(shù)組元素等。
數(shù)組這種數(shù)據(jù)結構的主要優(yōu)點在于如果給定索引,那么它會提供 O(1) 復雜度的搜索,這種搜索速度非常迅速。但是從數(shù)組中添加或移除元素會比較慢,因為一旦創(chuàng)建了數(shù)組,我們就很難再更改它的大小。如果需要更長或更短的數(shù)組,我們就需要重新創(chuàng)建新數(shù)組,并將老數(shù)組的所有元素復制到新數(shù)組中。
解決數(shù)組問題的關鍵是對數(shù)組數(shù)據(jù)結構有比較深的理解,同時還需要了解循環(huán)、遞歸和基本運算子等常見的編程結構。以下是一些常見的數(shù)組編程面試問題:
1. 在一個元素為 1 到 100 的整數(shù)數(shù)組中,如何搜索缺失元素?
2. 給定一個數(shù)組,如何搜索重復元素?
3. 給定一個亂序數(shù)組,如何搜索最大和最小元素?
4. 給定一個數(shù)值,如何搜索整數(shù)數(shù)組中加和為該數(shù)值的成對元素?
5. 如果數(shù)組包含多個重復值,如何搜索所有重復值?
6. 給定一個數(shù)組,如何用 Java 刪除重復元素?如何在不使用庫的情況下移除數(shù)組中的重復元素?
7. 如何使用快速排序算法對整數(shù)數(shù)組進行排序?
8. 如何使用 Java 反轉一個數(shù)組?
這些問題不僅能幫助我們提高解決問題的能力,同時也能提升我們關于數(shù)組數(shù)據(jù)結構的理解。
如果你需要了解更多基于數(shù)組的深度問題,你可以在 GitHub 或 Coursera 上多找找關于數(shù)據(jù)結構的課程與資料,例如在 GitHub 中,就有非常多關于數(shù)組的學習資料,下面我們介紹了一份中文版的谷歌的面試資料,它在 GitHub 上有 6 萬多的收藏量。
項目地址:https://github.com/jwasham/coding-interview-university/blob/master/translations/README-cn.md
2. 鏈表編程面試問題
鏈表是補充數(shù)組數(shù)據(jù)結構的另一種常見數(shù)據(jù)結構。與數(shù)組類似,它也是線性數(shù)據(jù)結構,以線性方式存儲元素。
然而,與數(shù)組不同的是,它不會將元素存儲在連續(xù)的位置;相反,它會將其分散存儲在內(nèi)存中,彼此通過節(jié)點相互連接。鏈表是節(jié)點列表,其中每個節(jié)點包含存儲的值和下一個節(jié)點的地址。
由于這種結構,在鏈表中添加或刪除元素變得很簡單,因為你只需要改變鏈接而不是創(chuàng)建數(shù)組,但是這樣會使搜索變得困難,并且經(jīng)常需要 O(n) 的時間復雜度才能在單個鏈表中找到某個元素。
這篇文章(https://javarevisited.blogspot.com/2013/07/difference-between-array-and-linked-list-java.html)提供了更多關于數(shù)組和鏈表數(shù)據(jù)結構之間差異的信息。
鏈表還有多種變體,如單鏈表,即允許在一個方向(正向或反向)上遍歷;雙鏈表則允許你在兩個方向(向前或向后)遍歷;最后是循環(huán)鏈表,它形成一個循環(huán)。
要解決關于鏈表的問題,掌握遞歸知識很重要,因為鏈表是遞歸數(shù)據(jù)結構。
如果你從鏈表中取出一個節(jié)點,剩下的數(shù)據(jù)結構仍然是鏈表,因此,許多鏈表問題的遞歸解比迭代解更簡單。
以下是關于鏈表的一些常見問題和解決方案:
9. 如何在一次傳遞中找到單鏈表的中間元素?
10. 如何檢查給定的鏈表是否包含循環(huán)?如何找到循環(huán)的起始節(jié)點?
11. 如何反轉鏈表?
12. 在沒有遞歸的情況下如何反轉單鏈表?
13. 如何刪除亂序鏈表中的重復節(jié)點?
14. 如何測量單鏈表的長度?
15. 如何從單鏈表的末端找出第三個節(jié)點?
16. 如何使用堆棧算出兩個鏈表的總和?
這些問題有助于你發(fā)展解決問題的技能,并提升你對鏈表數(shù)據(jù)結構的了解。目前有非常多的資源可以幫助我們理解鏈表,例如在 GitHub 上一個交互式的編碼實踐中,它使用 Jupyter Notebook 提供了數(shù)據(jù)結構與算法的各種練習,其中就包括了很多鏈表問題及實踐。
項目地址:https://github.com/donnemartin/interactive-coding-challenges
3. 字符串編碼面試問題
除了數(shù)組和鏈表數(shù)據(jù)結構,字符串也是編程工作面試中的另一熱點話題。我參加過的編碼面試基本都問過關于字符串的問題。
如果你了解數(shù)組,那么你就能輕易地解決基于字符串的問題,因為字符串就是字符數(shù)組。因此,你通過解決數(shù)組編程問題學到的所有技巧,也能用來解決字符串編程問題。
以下是編程工作面試中常問的字符串編程問題列表:
17. 如何打印字符串中重復的字符?
18. 如何檢查兩個字符串是否互為逆序?
19. 如何打印字符串中首個非重復字符?
20. 如何使用遞歸反轉給定字符串?
21. 如何檢查一個字符串是否僅包含數(shù)字?
22. 如何搜索字符串中的重復字符?
23. 給定一個字符串,如何統(tǒng)計元音數(shù)和輔音數(shù)?
24. 給定一個字符,如同計算它在字符串中出現(xiàn)的次數(shù)?
25. 如何搜索一個字符串的所有排列情況?
26. 在不使用任何庫的情況下,如何反轉給定句子中的單詞?
27. 如何檢查兩個字符串是不是互為旋轉(rotation)?
28. 給定一個字符串,如何檢查它是不是回文結構?
這些問題可以提升你對字符串數(shù)據(jù)結構的了解。如果你能獨立解決所有這些字符串問題,說明你的狀態(tài)很好。
如果想深入了解一些更復雜的問題,我推薦你去看 Steven Skiena 的《The Algorithm Design Manual》,這本書里有最難的算法問題。
網(wǎng)上也有該書的 PDF 版,下載地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.471.4772&rep=rep1&type=pdf
如果你需要更多的練習,這里還有另外 20 個關于字符串編程的問題:
http://javarevisited.blogspot.sg/2015/01/top-20-string-coding-interview-question-programming-interview.html
4. 二叉樹編程面試問題
現(xiàn)在我們只了解了線性數(shù)據(jù)結構方面的問題,但是真實世界中的所有信息不可能全是線性的,這就需要樹數(shù)據(jù)結構了。
樹數(shù)據(jù)結構允許以層級形式存儲數(shù)據(jù)。根據(jù)存儲數(shù)據(jù)的方式,有多種樹類型,如二叉樹。
和它的近親二叉查找樹一樣,它也是最流行的樹數(shù)據(jù)結構之一。因此,你會看到很多相關的有趣問題。例如,如何遍歷樹、計算節(jié)點數(shù)量、找出深度,以及檢查是否平衡。
解決二叉樹問題的關鍵在于深厚的理論知識,如二叉樹的大小或深度、什么是葉節(jié)點、什么是節(jié)點,以及了解流行的遍歷算法。
以下是軟件工程師或開發(fā)工作面試中常見的二叉樹相關編程問題:
29. 如何實現(xiàn)二叉查找樹?
30. 如何對給定二叉樹執(zhí)行前序遍歷?
31. 如何在沒有遞歸的情況下對給定二叉樹執(zhí)行前序遍歷?
32. 如何對給定二叉樹執(zhí)行中序遍歷?
33. 如何在沒有遞歸的情況下通過對給定二叉樹執(zhí)行中序遍歷來打印所有節(jié)點?
34. 如何實現(xiàn)后序遍歷算法?
35. 如何在沒有遞歸的情況下對給定二叉樹執(zhí)行后序遍歷?
36. 如何打印二叉查找樹的所有葉節(jié)點?
37. 如何計算給定二叉樹中葉節(jié)點的數(shù)量?
38. 如何在給定數(shù)組中執(zhí)行二元搜索?
如果你認為自己對二叉樹編程的了解不足,無法解決這些問題,我建議你先熟練掌握數(shù)據(jù)結構和算法知識,比如你可以上這門課《From 0 to 1: Data Structures & Algorithms in Java》。同樣,你也可以查閱準備 Google 面試的一套完整手冊,這套 GitHub 手冊前面已經(jīng)介紹了,但它在二叉樹等數(shù)據(jù)結構上真的有非常多的案例與教程。
項目地址:https://github.com/jwasham/coding-interview-university
如果你需要更多推薦,可以參考:
5. 其它編程面試問題
除了數(shù)據(jù)結構方面的問題,大部分編程工作面試也會問關于算法、設計、位運算和通用的邏輯問題。
針對性練習很重要,因為有時在實際面試中它們會有點難解。事先練習不僅能夠讓你熟悉這些問題,還能讓你在向面試官解釋答案時更加自信。
39. 如何實現(xiàn)冒泡排序算法(bubble sort algorithm)?
40. 如何實現(xiàn)迭代快速排序算法(iterative quicksort algorithm)?
41. 如何實現(xiàn)插入排序算法(insertion sort algorithm)?
42. 如何實現(xiàn)歸并排序算法(merge sort algorithm)?
43. 如何實現(xiàn)桶排序算法(bucket sort algorithm)?
44. 如何實現(xiàn)計數(shù)排序算法(counting sort algorithm)?
45. 如何實現(xiàn)基數(shù)排序算法(radix sort algorithm)?
46. 如何在不使用第三個變量的前提下交換兩個數(shù)字?
47. 如何確認兩個矩形是否重疊?
48. 如何設計自動販賣機?
如果你想查看更多此類編程問題,可以閱讀這本書《Cracking the Coding Interview: 189 Programming Questions and Solutions》,適合短時間內(nèi)準備編程工作面試。
下載地址:http://lib1.org/_ads/fcb49f53d5e943ce8acdc4469f63dc5d
你練習的問題越多,準備就越充分。因此,如果你認為 48 道題不夠的話,可以查看:
現(xiàn)在你已經(jīng)準備好面試了
這部分將介紹一些數(shù)據(jù)結構和算法之外的常見問題,可以幫助你在面試中取得更好的表現(xiàn)。
我的博客中還有很多此類問題,詳見:http://www.java67.com/
這些常見的編程、數(shù)據(jù)結構和算法問題是你去任何一家公司面試都必須知道的,不管是大公司還是小公司,不管面試的職位高或低。
如果你正在尋找編程或軟件開發(fā)工作,那么你可以先使用這些編程問題開始準備。該列表提供了一些不錯的面試準備話題,能夠幫助你評估自己的面試準備工作是否充分。
熟練掌握數(shù)據(jù)結構和算法知識是編程工作面試成功的關鍵,你應該更多地關注這些問題。
擴展閱讀:
原文鏈接:https://hackernoon.com/50-data-structure-and-algorithms-interview-questions-for-programmers-b4b1ac61f5b0
來源:環(huán)球時報
【環(huán)球時報記者郭媛丹 劉煊尊】“南海戰(zhàn)略態(tài)勢感知”計劃8月1日發(fā)布消息稱,美國軍方7月出動將近70架次的大型偵察機前往南海進行抵近偵察,出動頻率與強度均大幅提高。而這已經(jīng)不是該平臺發(fā)布的消息首次引發(fā)外界高度關注了,由于美艦機頻繁到南海進行挑釁,據(jù)《環(huán)球時報》記者統(tǒng)計,從7月15日至30日,該平臺發(fā)布了24條關于美艦機在南海、東海等海域活動的信息。美軍艦機在南海區(qū)域活動的信息是如何出爐的,從這些數(shù)據(jù)中可以看出美軍艦機在南?;顒佑惺裁礃拥奈kU趨勢,中美在南海發(fā)生軍事沖突的可能性有多大呢?針對這些問題,《環(huán)球時報》記者日前專訪了“南海戰(zhàn)略態(tài)勢感知”計劃主任胡波。
發(fā)布美艦機南海動態(tài)的初衷
據(jù)《環(huán)球時報》記者了解,“南海戰(zhàn)略態(tài)勢感知”計劃是一個開放式的智庫,是一個國內(nèi)外學者協(xié)作的網(wǎng)絡,宗旨是全面客觀掌握南海的動態(tài)和資訊,準確感知南海的軍事、政治、經(jīng)濟、環(huán)境等態(tài)勢。為了研究的需要,建立了自己的??諔B(tài)勢系統(tǒng),持續(xù)跟蹤和披露域內(nèi)域外國家在南海的艦機動態(tài)。
談及對外公布美國在南海艦機動態(tài)的初衷,胡波表示,“我們并不想制造什么大新聞,只是把數(shù)據(jù)客觀呈現(xiàn)出來,通常也不持立場,主要是為了幫助研究或關注南海的專家以及公眾建立常識。因為除了中美等各國軍方外,很少有人知道見之于媒體報道中的南海每天發(fā)生了什么,甚至大部分研究人員都無法掌握南海的態(tài)勢究竟是怎么樣。當公眾有了基本常識,大家對南海問題的認識和研究也能更為理性,長期來看,這有利于南海的和平。”
胡波認為,在南海信息公開方面中美之間是失衡的,美國對外發(fā)布公開的信息很多,于是外界看到的南海態(tài)勢都是美國官員及智庫塑造出來的。“我們對外發(fā)布的信息之所以受到關注也恰恰說明了南海信息的稀缺?!?/p>
根據(jù)“南海戰(zhàn)略態(tài)勢感知”的數(shù)據(jù),7月,美軍總計出動67架次的大型偵察機前往南海開展偵察行動,型號涵蓋P-8A、P-3C、EP-3E和MQ-4C等。
胡波介紹,“即便如此,我們監(jiān)控并發(fā)布出來的也是冰山一角”。該智庫跟蹤依托于國內(nèi)外分享船舶跟蹤識別系統(tǒng)(AIS)和廣播式自動監(jiān)視系統(tǒng)(ADS-B),這兩個系統(tǒng)的信息均是開源的商業(yè)數(shù)據(jù),國內(nèi)外都有很多獲取途徑。我們要做的是數(shù)據(jù)挖掘工作,在海量原始數(shù)據(jù)中,設定相關參數(shù),自動化提取與南海戰(zhàn)略態(tài)勢相關的數(shù)據(jù),比如軍艦、軍機、公務船和漁船等,然后在此基礎上進行統(tǒng)計和分析。由于數(shù)據(jù)來源及手段相對單一,在精確性、完整性和穩(wěn)定性上肯定無法與各國官方的內(nèi)部系統(tǒng)相比?!氨热缥覀冎荒塬@取大型偵察機的部分相關軌跡,無法統(tǒng)計小型偵察機,也無法跟蹤艦載機的活動情況。此外,如果軍機不開啟ADS-B應答器,也是無法監(jiān)測到的?!?/p>
數(shù)據(jù)顯示美軍南海活動新趨勢
該智庫8月1日公布的監(jiān)控數(shù)據(jù)顯示,美軍在7月出動大型偵察機的架次較5月的35次及6月的49次增加明顯,幾乎是5月的兩倍。
這是近些年美國在南海活動頻率持續(xù)增長的一個縮影。據(jù)介紹,從2009年至今,美軍在南?;顒拥念l率大幅增強。水面艦艇的存在提高了60%以上,每年已達約1000個艦日;平均每天出動3-5架次以上的軍機前往南?;顒?,其中大部分是偵察機,全年在1500個架次以上,幾乎較2009年翻了一番。此外,美軍在南海活動的針對性變得越來越明顯,比如在解放軍有行動期間,美軍的偵察機就飛得很勤。以7月1日至5日解放軍西沙演習期間為例,美軍5天共出動15個架次偵察機。此外7月份累計9架次進入中國領?;€以外70海里范圍內(nèi)活動。這種抵近偵察具有明顯的挑釁性,因為“擁有全方位先進偵察手段的美軍即便是要搜集中國的情報,也不需要保持如此高的偵察頻率,并抵近到如此近的距離。”
談及這一趨勢背后的原因,胡波表示,“美國空中偵察的力度在2020年大幅增多,這背后的因素可能與新冠病毒疫情暴發(fā)有一定關系,由于美軍艦艇頻頻發(fā)生群體性感染事件,導致水面艦艇不足,因此可能加大了航空偵察力度。”此外,胡波認為,因為大國競爭的戰(zhàn)略思維,美國戴著有色眼鏡看人,以己度人,擔心在疫情期間中國在南海搞事情,因此加大了在南海兵力部署。目前,“美軍在南海的部署和行動,消耗了美軍印太戰(zhàn)區(qū)60%的前沿兵力?!?/p>
中美在南海是否會爆發(fā)沖突
胡波認為,從監(jiān)控數(shù)據(jù)分析,美軍在南海出現(xiàn)的機型種類之多已經(jīng)達到在全球其他地區(qū)罕見的程度,比如E-8C戰(zhàn)場指揮與監(jiān)視機和E-3B空中預警機等監(jiān)視與控制飛機已經(jīng)頻頻出現(xiàn)在中國當面海域。
另一面,近年隨著中國海軍和空軍能力提升,因此中美軍事力量在南海相遇頻次增多。雙方之間每天都會發(fā)生數(shù)次海上相遇事件,每年數(shù)千次。
胡波認為, 這種風險存在于三方面,雖然中美兩軍現(xiàn)在有《海上意外相遇規(guī)則》等規(guī)避風險的一些規(guī)則,但這些規(guī)則從字面上就可理解,都是為意外相遇而設立的安排。但現(xiàn)實中很多海空相遇是有意為之的,比較突出的有三大類:比如,美方艦艇頻繁闖入中國南沙駐守島礁12海里或西沙領海及內(nèi)水,中方不得不進行驅離和攔截,這很難保證雙方在此過程中不發(fā)生意外。其次,美軍機在空中實施越來越多的抵近偵察,中方必然會采取警戒等相應措施,風險也極高,2001年的撞機事件就是美軍機抵近偵察導致的。另外,中美雙方每年都會在南海進行各類軍事演習,雙方通常都會針對對方進行偵察和監(jiān)視。這種行為從軍事上可以理解,但如果太過接近,必然容易引發(fā)摩擦。如2013年12月,美軍“考本斯”號巡洋艦異常接近南海訓練的遼寧艦航母編隊。近些年來,美方更是越來越不注重安全距離,這非常容易發(fā)生危機。
胡波認為,“現(xiàn)在,一旦中美爆發(fā)任何??找馔?,基于中美目前的總體關系氛圍,摩擦很可能得不到有效管控而直接升級。因此,中美兩軍在南?;拥牟淮_定因素很大,風險越來越高?!?/p>