尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
選自hackernoon
作者:javinpaul
機器之心編譯
機器之心編輯部
同學,你會手寫二叉樹嗎?近來正值秋招季節,很多編程面試都要求手寫數據結構手推機器學習算法。各位同學為了面試也會刷各種編程題,其中數據結構與排序搜尋算法又是最為基礎的內容。在本文中,我們為各位讀者準備了 48 道基礎面試題,它可以幫助我們更深地理解數據結構。本文所有面試題都提供了 Java 解決方案,並介紹了比較流行的 GitHub 面試題項目。
很多計算機科學專業畢業生和工程師都會去 Uber、今日頭條這樣的獨角獸公司,或者亞馬遜、微軟和Google這樣的科技巨頭申請編程和軟件開發職位。你在申請這些工作時,肯定很想知道面試官會問到哪些問題。
在本文中,作者會分享一些常見的編程面試問題,這些問題來自於針對不同經驗層次的工程師的面試——從應屆畢業生到具有一兩年經驗的工程師。
編程面試題通常包含數據結構和基於算法的問題,以及一些邏輯問題,例如:如何在不使用臨時變量的情況下交換兩個整數?
為了清晰,編程面試題需要劃分為不同主題。我們在面試中經常看到的領域是數組、鏈表、字符串、二叉樹以及有關算法的問題(例如字符串算法、快速排序或基數排序等排序算法),本文將介紹這些內容。
雖然本文無法覆蓋你在面試中將要面臨的所有問題,但是它可以給你提供足夠的思路,讓你在面試時對於各種挑戰有所準備。
一旦解決了這些問題,你就可以有信心面對任何電話面試或現場面試了。
當然,如果你對於基本數據結構和算法沒有足夠的知識儲備,那麼直接接觸以下問題將對你沒有幫助。
算法和編程面試題 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 中,就有非常多關於數組的學習資料,下面我們介紹了一份中文版的Google的面試資料,它在 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
機器之心《全球500強上市公司人工智能戰略適應性報告》重磅發布。17個行業,140家上市公司,縱覽500強落地人工智能的成與敗。
點擊閱讀原文,申請獲取報告PDF,我們將在審核後統一發送。