手寫二叉樹?程式設計師面試最常見問題TOP 48
同學,你會手寫二叉樹嗎?近來正值秋招季節,很多程式設計面試都要求手寫資料結構手推機器學習演算法。各位同學為了面試也會刷各種程式設計題,其中資料結構與排序搜尋演算法又是最為基礎的內容。在本文中,我們為各位讀者準備了 48 道基礎面試題,它可以幫助我們更深地理解資料結構。本文所有面試題都提供了 Java 解決方案,並介紹了比較流行的 GitHub 面試題專案。
很多電腦科學專業畢業生和程式員都會去 Uber、今日頭條這樣的獨角獸公司,或者亞馬遜、微軟和谷歌這樣的科技巨頭申請程式設計和軟體開發職位。你在申請這些工作時,肯定很想知道面試官會問到哪些問題。
在本文中,作者會分享一些常見的程式設計面試問題,這些問題來自於針對不同經驗層次的程式設計師的面試——從應屆畢業生到具有一兩年經驗的程式設計師。
程式設計面試題通常包含資料結構和基於演算法的問題,以及一些邏輯問題,例如:如何在不使用臨時變數的情況下交換兩個整數?
為了清晰,程式設計面試題需要劃分為不同主題。我們在面試中經常看到的領域是陣列、連結串列、字串、二叉樹以及有關演算法的問題(例如字串演算法、快速排序或基數排序等排序演算法),本文將介紹這些內容。
雖然本文無法覆蓋你在面試中將要面臨的所有問題,但是它可以給你提供足夠的思路,讓你在面試時對於各種挑戰有所準備。
一旦解決了這些問題,你就可以有信心面對任何電話面試或現場面試了。
當然,如果你對於基本資料結構和演算法沒有足夠的知識儲備,那麼直接接觸以下問題將對你沒有幫助。
演算法和程式設計面試題 TOP 48
廢話少說,這裡有一份「程式設計面試最常見的問題列表」:
1. 陣列程式設計面試問題
陣列是最基本的資料結構,它將元素儲存在連續的記憶體空間中。陣列也是面試官最喜歡問的主題之一,在任何程式設計面試中都能聽到非常多關於陣列的問題,例如反轉陣列、排序陣列或搜尋陣列元素等。
陣列這種資料結構的主要優點在於如果給定索引,那麼它會提供 O(1) 複雜度的搜尋,這種搜尋速度非常迅速。但是從陣列中新增或移除元素會比較慢,因為一旦建立了陣列,我們就很難再更改它的大小。如果需要更長或更短的陣列,我們就需要重新建立新陣列,並將老陣列的所有元素複製到新陣列中。
解決陣列問題的關鍵是對陣列資料結構有比較深的理解,同時還需要了解迴圈、遞迴和基本運運算元等常見的程式設計結構。以下是一些常見的陣列程式設計面試問題:
1. 在一個元素為 1 到 100 的整數陣列中,如何搜尋缺失元素?
-
解決方案:http://javarevisited.blogspot.com/2014/11/how-to-find-missing-number-on-integer-array-java.html
2. 給定一個數組,如何搜尋重複元素?
-
解決方案:http://javarevisited.blogspot.com/2014/01/how-to-remove-duplicates-from-array-java-without-collection-API.html
3. 給定一個亂序陣列,如何搜尋最大和最小元素?
-
解決方案:http://java67.blogspot.com/2014/02/how-to-find-largest-and-smallest-number-array-in-java.html
4. 給定一個數值,如何搜尋整數陣列中加和為該數值的成對元素?
-
解決方案:http://javarevisited.blogspot.com/2014/08/how-to-find-all-pairs-in-array-of-integers-whose-sum-equal-given-number-java.html
5. 如果陣列包含多個重複值,如何搜尋所有重複值?
-
解決方案:http://javarevisited.blogspot.com/2014/03/3-ways-to-find-first-non-repeated-character-String-programming-problem.html
6. 給定一個數組,如何用 Java 刪除重複元素?如何在不使用庫的情況下移除陣列中的重複元素?
-
解決方案:http://javarevisited.blogspot.com/2014/01/how-to-remove-duplicates-from-array-java-without-collection-API.html
7. 如何使用快速排序演算法對整數陣列進行排序?
-
解決方案:http://javarevisited.blogspot.com/2014/08/quicksort-sorting-algorithm-in-java-in-place-example.html
8. 如何使用 Java 反轉一個數組?
-
解決方案:http://javarevisited.blogspot.com/2013/03/how-to-reverse-array-in-java-int-String-array-example.html
這些問題不僅能幫助我們提高解決問題的能力,同時也能提升我們關於陣列資料結構的理解。
如果你需要了解更多基於陣列的深度問題,你可以在 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. 如何在一次傳遞中找到單鏈表的中間元素?
-
解決方案:http://javarevisited.blogspot.sg/2012/12/how-to-find-middle-element-of-linked-list-one-pass.html
10. 如何檢查給定的連結串列是否包含迴圈?如何找到迴圈的起始節點?
-
解決方案:http://javarevisited.blogspot.sg/2013/05/find-if-linked-list-contains-loops-cycle-cyclic-circular-check.html
11. 如何反轉連結串列?
-
解決方案:http://www.java67.com/2016/07/how-to-reverse-singly-linked-list-in-java-example.html
12. 在沒有遞迴的情況下如何反轉單鏈表?
-
解決方案:http://javarevisited.blogspot.sg/2017/03/how-to-reverse-linked-list-in-java-using-iteration-and-recursion.html
13. 如何刪除亂序連結串列中的重複節點?
-
解決方案:https://www.geeksforgeeks.org/remove-duplicates-from-an-unsorted-linked-list/
14. 如何測量單鏈表的長度?
-
解決方案:http://javarevisited.blogspot.sg/2016/05/how-do-you-find-length-of-singly-linked.html
15. 如何從單鏈表的末端找出第三個節點?
-
解決方案:http://javarevisited.blogspot.sg/2016/07/how-to-find-3rd-element-from-end-in-linked-list-java.html
16. 如何使用堆疊算出兩個連結串列的總和?
-
解決方案:https://www.geeksforgeeks.org/sum-of-two-linked-lists/
這些問題有助於你發展解決問題的技能,並提升你對連結串列資料結構的瞭解。目前有非常多的資源可以幫助我們理解連結串列,例如在 GitHub 上一個互動式的編碼實踐中,它使用 Jupyter Notebook 提供了資料結構與演算法的各種練習,其中就包括了很多連結串列問題及實踐。
專案地址:https://github.com/donnemartin/interactive-coding-challenges
3. 字串編碼面試問題
除了陣列和連結串列資料結構,字串也是程式設計工作面試中的另一熱點話題。我參加過的編碼面試基本都問過關於字串的問題。
如果你瞭解陣列,那麼你就能輕易地解決基於字串的問題,因為字串就是字元陣列。因此,你通過解決陣列程式設計問題學到的所有技巧,也能用來解決字串程式設計問題。
以下是程式設計工作面試中常問的字串程式設計問題列表:
17. 如何列印字串中重複的字元?
-
解決方案:http://java67.blogspot.sg/2014/03/how-to-find-duplicate-characters-in-String-Java-program.html
18. 如何檢查兩個字串是否互為逆序?
-
解決方案:http://javarevisited.blogspot.sg/2013/03/Anagram-how-to-check-if-two-string-are-anagrams-example-tutorial.html
19. 如何列印字串中首個非重複字元?
-
解決方案:http://javarevisited.blogspot.sg/2014/03/3-ways-to-find-first-non-repeated-character-String-programming-problem.html
20. 如何使用遞迴反轉給定字串?
-
解決方案:http://javarevisited.blogspot.sg/2012/01/how-to-reverse-string-in-java-using.html
21. 如何檢查一個字串是否僅包含數字?
-
解決方案:http://javarevisited.blogspot.sg/2012/10/regular-expression-example-in-java-to-check-String-number.html
22. 如何搜尋字串中的重複字元?
-
解決方案:http://java67.blogspot.sg/2014/03/how-to-find-duplicate-characters-in-String-Java-program.html
23. 給定一個字串,如何統計母音數和子音數?
-
解決方案:http://java67.blogspot.sg/2013/11/how-to-count-vowels-and-consonants-in-Java-String-word.html
24. 給定一個字元,如同計算它在字串中出現的次數?
-
解決方案:http://javarevisited.blogspot.sg/2012/12/how-to-count-occurrence-of-character-in-String.html
25. 如何搜尋一個字串的所有排列情況?
-
解決方案:http://javarevisited.blogspot.com/2015/08/how-to-find-all-permutations-of-string-java-example.html
26. 在不使用任何庫的情況下,如何反轉給定句子中的單詞?
-
解決方案:http://java67.blogspot.com/2015/06/how-to-reverse-words-in-string-java.html
27. 如何檢查兩個字串是不是互為旋轉(rotation)?
-
解決方案:http://www.java67.com/2017/07/string-rotation-in-java-write-program.html
28. 給定一個字串,如何檢查它是不是迴文結構?
-
解決方案:http://java67.blogspot.com/2015/06/how-to-check-is-string-is-palindrome-in.html
這些問題可以提升你對字串資料結構的瞭解。如果你能獨立解決所有這些字串問題,說明你的狀態很好。
如果想深入瞭解一些更復雜的問題,我推薦你去看 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. 如何實現二叉搜尋樹?
-
解決方案:http://javarevisited.blogspot.sg/2015/10/how-to-implement-binary-search-tree-in-java-example.html#axzz4wnEtnNB3
30. 如何對給定二叉樹執行前序遍歷?
-
解決方案:http://javarevisited.blogspot.sg/2016/07/binary-tree-preorder-traversal-in-java-using-recursion-iteration-example.html#axzz5ArdIFI7y
31. 如何在沒有遞迴的情況下對給定二叉樹執行前序遍歷?
-
解決方案:http://www.java67.com/2016/07/binary-tree-preorder-traversal-in-java-without-recursion.html
32. 如何對給定二叉樹執行中序遍歷?
-
解決方案:http://www.java67.com/2016/08/binary-tree-inorder-traversal-in-java.html
33. 如何在沒有遞迴的情況下通過對給定二叉樹執行中序遍歷來列印所有節點?
-
解決方案:http://www.java67.com/2016/08/binary-tree-inorder-traversal-in-java.html
34. 如何實現後序遍歷演算法?
-
解決方案:http://www.java67.com/2016/10/binary-tree-post-order-traversal-in.html
35. 如何在沒有遞迴的情況下對給定二叉樹執行後序遍歷?
-
解決方案:http://www.java67.com/2017/05/binary-tree-post-order-traversal-in-java-without-recursion.html
36. 如何列印二叉搜尋樹的所有葉節點?
-
解決方案:http://www.java67.com/2016/09/how-to-print-all-leaf-nodes-of-binary-tree-in-java.html
37. 如何計算給定二叉樹中葉節點的數量?
-
解決方案:http://javarevisited.blogspot.sg/2016/12/how-to-count-number-of-leaf-nodes-in-java-recursive-iterative-algorithm.html
38. 如何在給定陣列中執行二元搜尋?
-
解決方案:http://javarevisited.blogspot.sg/2015/10/how-to-implement-binary-search-tree-in-java-example.html#axzz4wnEtnNB3
如果你認為自己對二叉樹程式設計的瞭解不足,無法解決這些問題,我建議你先熟練掌握資料結構和演算法知識,比如你可以上這門課《From 0 to 1: Data Structures & Algorithms in Java》。同樣,你也可以查閱準備 Google 面試的一套完整手冊,這套 GitHub 手冊前面已經介紹了,但它在二叉樹等資料結構上真的有非常多的案例與教程。
專案地址:https://github.com/jwasham/coding-interview-university
如果你需要更多推薦,可以參考:
-
http://javarevisited.blogspot.sg/2015/07/5-data-structure-and-algorithm-books-best-must-read.html
-
http://javarevisited.blogspot.sg/2018/01/top-5-free-data-structure-and-algorithm-courses-java—c-programmers.html
5. 其它程式設計面試問題
除了資料結構方面的問題,大部分程式設計工作面試也會問關於演算法、設計、位運算和通用的邏輯問題。
針對性練習很重要,因為有時在實際面試中它們會有點難解。事先練習不僅能夠讓你熟悉這些問題,還能讓你在向面試官解釋答案時更加自信。
39. 如何實現氣泡排序演算法(bubble sort algorithm)?
-
解決方案:http://javarevisited.blogspot.sg/2014/08/bubble-sort-algorithm-in-java-with.html#axzz5ArdIFI7y
40. 如何實現迭代快速排序演算法(iterative quicksort algorithm)?
-
解決方案:http://javarevisited.blogspot.sg/2016/09/iterative-quicksort-example-in-java-without-recursion.html#axzz5ArdIFI7y
41. 如何實現插入排序演算法(insertion sort algorithm)?
-
解決方案:http://www.java67.com/2014/09/insertion-sort-in-java-with-example.html
42. 如何實現歸併排序演算法(merge sort algorithm)?
-
解決方案:http://www.java67.com/2018/03/mergesort-in-java-algorithm-example-and.html
43. 如何實現桶排序演算法(bucket sort algorithm)?
-
解決方案:http://javarevisited.blogspot.sg/2017/01/bucket-sort-in-java-with-example.html
44. 如何實現計數排序演算法(counting sort algorithm)?
-
解決方案:http://www.java67.com/2017/06/counting-sort-in-java-example.html
45. 如何實現基數排序演算法(radix sort algorithm)?
-
解決方案:http://www.java67.com/2018/03/how-to-implement-radix-sort-in-java.html
46. 如何在不使用第三個變數的前提下交換兩個數字?
-
解決方案:http://www.java67.com/2015/08/how-to-swap-two-integers-without-using.html
47. 如何確認兩個矩形是否重疊?
-
解決方案:http://javarevisited.blogspot.sg/2016/10/how-to-check-if-two-rectangle-overlap-in-java-algorithm.html
48. 如何設計自動販賣機?
-
解決方案:http://javarevisited.blogspot.sg/2016/06/design-vending-machine-in-java.html
如果你想檢視更多此類程式設計問題,可以閱讀這本書《Cracking the Coding Interview: 189 Programming Questions and Solutions》,適合短時間內準備程式設計工作面試。
下載地址:http://lib1.org/_ads/fcb49f53d5e943ce8acdc4469f63dc5d
你練習的問題越多,準備就越充分。因此,如果你認為 48 道題不夠的話,可以檢視:
-
https://javarevisited.blogspot.com/2015/02/50-programmer-phone-interview-questions-answers.html
-
http://javarevisited.blogspot.sg/2016/06/top-5-books-for-programming-coding-interviews-best.html
-
http://javarevisited.blogspot.sg/2018/02/10-courses-to-prepare-for-programming-job-interviews.html
現在你已經準備好面試了
這部分將介紹一些資料結構和演算法之外的常見問題,可以幫助你在面試中取得更好的表現。
我的部落格中還有很多此類問題,詳見:http://www.java67.com/
這些常見的程式設計、資料結構和演算法問題是你去任何一家公司面試都必須知道的,不管是大公司還是小公司,不管面試的職位高或低。
如果你正在尋找程式設計或軟體開發工作,那麼你可以先使用這些程式設計問題開始準備。該列表提供了一些不錯的面試準備話題,能夠幫助你評估自己的面試準備工作是否充分。
熟練掌握資料結構和演算法知識是程式設計工作面試成功的關鍵,你應該更多地關注這些問題。
擴充套件閱讀:
-
Data Structures and Algorithms: Deep Dive Using Java:https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fdata-structures-and-algorithms-deep-dive-using-java%2F
-
10 Books to Prepare Technical Programming/Coding Job Interviews:http://www.java67.com/2017/06/10-books-to-prepare-technical-coding-job-interviews.html
-
10 Algorithm Books Every Programmer Should Read:http://www.java67.com/2015/09/top-10-algorithm-books-every-programmer-read-learn.html
-
Top 5 Data Structure and Algorithm Books for Java Developers:http://javarevisited.blogspot.sg/2016/05/5-free-data-structure-and-algorithm-books-in-java.html#axzz4uXETWjmV
-
From 0 to 1: Data Structures & Algorithms in Java:https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Ffrom-0-to-1-data-structures%2F
-
Data Structure and Algorithms Analysis—Job Interview:https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fdata-structure-and-algorithms-analysis%2F
原文連結:https://hackernoon.com/50-data-structure-and-algorithms-interview-questions-for-programmers-b4b1ac61f5b0
ofollow,noindex" target="_blank">產業 程式設計 資料結構 排序搜尋演算法 JavaScript
相關資料
iteration
模型的權重在訓練期間的一次更新。迭代包含計算引數在單個批量資料上的梯度損失。
來源: sary#iteration" target="_blank" rel="nofollow,noindex">Google ML glossary
Logic
人工智慧領域用邏輯來理解智慧推理問題;它可以提供用於分析程式語言的技術,也可用作分析、表徵知識或程式設計的工具。目前人們常用的邏輯分支有命題邏輯(Propositional Logic )以及一階邏輯(FOL)等謂詞邏輯。
來源:機器之心
time complexity
在電腦科學中,演算法的時間複雜度是一個函式,它定量描述了該演算法的執行時間。這是一個代表演算法輸入值的字串的長度的函式。時間複雜度常用大O符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。例如,如果一個演算法對於任何大小為 n (必須比 n0 大)的輸入,它至多需要 5n3 + 3n 的時間執行完畢,那麼它的漸近時間複雜度是 O(n3)。
來源: 維基百科
Bytedance
“今日頭條”是一款基於資料探勘技術的個性化推薦引擎產品,它為使用者推薦有價值的、個性化的資訊,提供連線人與資訊的新型服務,是國內移動網際網路領域成長最快的產品之一。

機器之心是國內領先的前沿科技媒體和產業服務平臺,關注人工智慧、機器人和神經認知科學,堅持為從業者提供高質量內容和多項產業服務。