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