在程式設計師的職業生涯中,無論是在跳槽時還是晉升時都會遇到各式各樣的面試,那麼就技術層面上而言,面試有哪些寶典秘籍可供參考,希望本文的 101 道真題能給你幫助。
作者 | javinpaul,Java程式設計師
譯者 | 彎月,責編 | 屠敏
以下為譯文:
對程式設計師來說,編程面試有著非凡的意義。這是每個程式設計師都需要面對的難關,這是他們邁出學校走向軟體開發的第一重障礙。
更糟糕的是,你會發現網際網路上有那麼多人都認為編程面試存在缺陷,程式設計師的招聘過程非常痛苦,但是你不需要特別在意這些觀點,至少在你的職業生涯剛剛起步的時候不應該過度在意別人的言論。
他們可能沒有錯,但你羨慕的正是這些人身處的這座圍城。不論他們如何批評編程面試和程式設計師的聘用過程,他們中的許多人也同樣經歷過這重洗禮。
我們都知道編程面試系統並不完美,許多人都在嘗試改變,但在改變之前,你必須遵循規則才能進入系統。我們就把這個問題留給經驗豐富的開發人員來解決吧,作為初級開發人員,你的重點應該是順利通過編程面試,並拿下心儀的工作。
很多人都問我編程面試的問題以及如何順利通過編程面試,這就是我寫本文的初衷,希望本文能夠為程式設計師以及他們的職業生涯帶來直接或間接性的幫助。
在本文中,我將與大家分享程式設計師面試中的最常見101道面試題,相信每個程式設計師都應該知道這些問題。
編程面試需要做哪些準備?
首先,我們都很清楚編程面試的重要性,這點毋庸置疑,下面讓我們來討論一些實質性的內容。第一個問題是編程面試需要做哪些準備?
最需要準備的是數據結構方面的編程問題,例如有關數組的編程問題、字符串問題、鍊表問題、二叉樹問題、系統設計問題等等。
除了數據結構方面的問題之外,大多數編程工作面試還會問到算法、設計、位操作和常規的邏輯問題,我會在本節中詳細介紹。
你需要針對這些概念展開練習,因為在實際的面試中這些問題解決起來都很棘手。事先做好練習,不僅可以讓你熟悉題目,而且也可以更自信地向面試官解釋解決方案。
編程面試最大的難點之一就在於,編程題目的數量成千上萬,甚至還出現了LeetCode、HackerRank、Codewars、Topcoder、freeCodeCamp、HackerEarth等各大網站來訓練程式設計師如何應對編程面試,對於剛開始找工作的新手來說有點不知所措。
我堅信90%的成果都是通過10%的努力產生的(剩下的10%則需要你付出90%的努力),因此我收集了101道編程面試題,這些題目的難度都不太高,而且經常會出現在實際的面試中。
解決這些問題不僅可以給你信心,還可以幫助你認識一些最常見的算法模式,這也將也有助於你解決實際面試中不怎麼出現的問題。
編程面試的主要資源
選擇良好的資源對順利通過編程面試非常重要。如果你因為省錢選擇了錯誤的資源,那麼你就會浪費掉寶貴的準備時間,因此你應該花點功夫來尋找良好的資源。
以下是我反覆嘗試和測試過的資源,可以幫助你深入學習數據結構和算法:
數據結構與算法:面向Java開發人員的Java深度學習。學習有關數組、鍊表、樹、哈希表、棧、隊列、堆、排序算法和查詢算法的知識。地址:https://www.udemy.com/course/data-structures-and-algorithms-deep-dive-using-java/?LSNPUBID=JVFxdTr9V80&ranEAID=JVFxdTr9V80&ranMID=39197&ranSiteID=JVFxdTr9V80-HPbYWbCo.X7HdOBg0iEcvw面向Python愛好者的Python算法與數據結構。最新算法的實現指南:數組、鍊表、圖形算法和排序。地址:https://www.udemy.com/course/algorithms-and-data-structures-in-python/?LSNPUBID=JVFxdTr9V80&ranEAID=JVFxdTr9V80&ranMID=39197&ranSiteID=JVFxdTr9V80-vvq5Cs9SsXvEVSHIc1OFTgJavaScript算法與數據結構,適用於JavaScript程式設計師。計算機科學與編程測試不可或缺的練習。學習編程面試中需要解決的一切困難。地址:https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/?LSNPUBID=JVFxdTr9V80&ranEAID=JVFxdTr9V80&ranMID=39197&ranSiteID=JVFxdTr9V80-SkkBboVjFOyd00hvR2slRQ精通C和C++的數據結構和算法。地址:https://www.udemy.com/course/datastructurescncpp/?LSNPUBID=JVFxdTr9V80&ranEAID=JVFxdTr9V80&ranMID=39197&ranSiteID=JVFxdTr9V80-_3GVcwGZFWT4XsSuZYrgGAJava中的數據結構:Java中重要的數據結構和算法概念。本課程包含對所有常見數據結構的詳細回顧,並提供了Java實現級別的詳細信息,能夠幫助讀者精通這些技術。地址:https://www.educative.io/courses/data-structures-in-java-an-interview-refresher?affiliate_id=5073518643380224&source=post_page摸索編程測試:編程面試題的模式。地址:https://www.educative.io/courses/grokking-the-coding-interview?affiliate_id=5073518643380224以上就是編程面試的資源庫,這些資源的目的不是教你如何解決編程問題,而是教你如何通過各個模式解決特定類型的編程問題。掌握這些基本模式,就無需再懼怕面試中遇到的任何問題。
如果你喜歡看書,那麼我首推《Cracking The Coding Interview》(作者:Gayle Laakmann McDowell),這本書中介紹了189+個編程問題和解決方案。這是一本可以在短時間內幫助你為編程面試做好準備的好書。
編程面試與找工作的重要提示
要想在編程面試中有良好的表現,那麼就需要提前做大量的練習。這不僅可以訓練你的思維來辨識問題中的算法模式,而且可以在遇到從未見過的題目時讓你保持信心。學習儘可能多的數據結構和算法。這是上一個技巧的擴展,但這一步還需要閱讀而不僅僅是練習。例如,如果你了解哈希表,那麼就可以輕鬆解決許多關於數組和計數器的問題。樹和圖也是如此。選擇正確的數據結構是軟體開發以及編程面試中非常重要的一部分,除非你了解這些數據結構,否則就無法選擇。計劃好時間,能夠在規定的時間內迅速解決面試題的候選人更有可能在面試中有出色的表現,因此請計劃好自己的時間。考慮邊緣情況,並體現在代碼中。你可以通過空輸入、一些奇怪的輸入或一些非常大的輸入等邊緣情況來測試邊界條件和限制。解決問題後,向朋友或同事解釋你的解決方案也是編程題的一部分。通過你的解釋就可以看出你是否真的弄懂了整個問題。如果你可以輕鬆地說明,則表明你確實理解了。同樣,討論也可以讓面試更加順暢,此外你還可以提出一個替代解決方案,並發現現有算法中的一些缺陷。另一個對編程面試非常有幫助性的技巧是實戰——參加大量的面試。每次面試經歷都能讓你進步,而且還可以幫助你拿下更多offer,讓你有進一步談判的機會,並最終斬獲高薪。順便說一句,如果你準備好了參加編程面試,那麼也可以參加TripleByte的測驗,直接晉級Coursera、Adobe Acrobat、Dropbox、Grammarly、Uber、Quora、Evernote、Twitch等頂級高科技公司的最後一輪面試。
編程面試中最常見101道題目
為了節約你寶貴的時間,我整理出了如下編程面試中最常見101道題目。為了真正掌握列表中的各個問題,我建議你動手嘗試解決這些問題。
無論你是否會卡殼,都應該自己動手,因為這是唯一的學習方法。相信在解決幾個問題之後,你就會信心大增。此外,我建議你在遇到困難或解決問題後再看解決方案,如此一來你就可以學習比較不同的解決方案,並從不同角度解決問題。
註:括號內是問題的解決方案連結:
如何實現冒泡排序算法?(https://javarevisited.blogspot.com/2014/08/bubble-sort-algorithm-in-java-with.html#axzz5ArdIFI7y)如何實現歸併排序算法?(https://www.java67.com/2018/03/mergesort-in-java-algorithm-example-and.html)如何統計給定字符在字符串中出現的次數?(https://javarevisited.blogspot.com/2012/12/how-to-count-occurrence-of-character-in-String.html)如何輸出字符串中第一個非重複字符?(https://javarevisited.blogspot.com/2014/03/3-ways-to-find-first-non-repeated-character-String-programming-problem.html)如何像atoi()將給定String轉換為int?(https://javarevisited.blogspot.com/2011/08/convert-string-to-integer-to-string.html)如何實現桶排序算法?(https://javarevisited.blogspot.com/2017/01/bucket-sort-in-java-with-example.html)如何實現計數排序算法?(https://www.java67.com/2017/06/counting-sort-in-java-example.html)如何刪除數組中的重複項?(https://javarevisited.blogspot.com/2014/01/how-to-remove-duplicates-from-array-java-without-collection-API.html)如何用Java實現數組的反轉?(https://javarevisited.blogspot.com/2013/03/how-to-reverse-array-in-java-int-String-array-example.html)如何在不使用任何庫的情況下,刪除數組中的重複項?(https://javarevisited.blogspot.com/2014/01/how-to-remove-duplicates-from-array-java-without-collection-API.html)如何實現基數排序算法?(https://www.java67.com/2018/03/how-to-implement-radix-sort-in-java.html)如何在不使用第三個變量的情況下交換兩個數字?(https://www.java67.com/2015/08/how-to-swap-two-integers-without-using.html)如何檢查兩個矩形是否重疊?(https://javarevisited.blogspot.com/2016/10/how-to-check-if-two-rectangle-overlap-in-java-algorithm.html)如何設計一臺自動售貨機?(https://javarevisited.blogspot.com/2016/06/design-vending-machine-in-java.html)如何查找1-101的整數數組中的缺失數字?(https://javarevisited.blogspot.com/2014/11/how-to-find-missing-number-on-integer-array-java.html)如何查找給定整數數組中的重複數字?(https://javarevisited.blogspot.com/2014/01/how-to-remove-duplicates-from-array-java-without-collection-API.html)如果數組中包含多個重複項,如何查找重複的個數?(https://javarevisited.blogspot.com/2014/03/3-ways-to-find-first-non-repeated-character-String-programming-problem.html)穩定與不穩定排序算法之間的區別是什麼?(https://javarevisited.blogspot.com/2017/06/difference-between-stable-and-unstable-algorithm.html)如何用迭代實現快速排序算法?(https://javarevisited.blogspot.com/2016/09/iterative-quicksort-example-in-java-without-recursion.html#axzz5ArdIFI7y)如何查找未排序整數數組中的最大和最小的數字?(https://www.java67.com/2014/02/how-to-find-largest-and-smallest-number-array-in-java.html)如何反轉連結列表?如何在連結列表的中間添加元素?如何用Java實現連結列表排序?(https://www.java67.com/2016/02/how-to-sort-linkedlist-in-java-example.html)如何查找整數數組中總和等於給定數字的所有對?(https://javarevisited.blogspot.com/2014/08/how-to-find-all-pairs-in-array-of-integers-whose-sum-equal-given-number-java.html)如何實現插入排序算法?(https://www.java67.com/2014/09/insertion-sort-in-java-with-example.html)如何用Java刪除給定數組中的重複項?(https://javarevisited.blogspot.com/2014/01/how-to-remove-duplicates-from-array-java-without-collection-API.html)如何刪除字符串中的重複字符?(https://javarevisited.blogspot.com/2016/06/how-to-remove-duplicate-characters-from-String-Java.html)如何查找給定字符串中出現次數最多的字符?(https://javarevisited.blogspot.com/2012/12/how-to-count-occurrence-of-character-in-String.html)如何使用快速排序算法對整數數組進行排序?(https://javarevisited.blogspot.com/2014/08/quicksort-sorting-algorithm-in-java-in-place-example.html)如何反轉給定字符串?(https://www.java67.com/2016/06/how-to-reverse-string-in-place-in-java.html)如何輸出字符串中的重複字符?(https://www.java67.com/2014/03/how-to-find-duplicate-characters-in-String-Java-program.html)如何檢查兩個字符串是否是易位構詞?(https://javarevisited.blogspot.com/2013/03/Anagram-how-to-check-if-two-string-are-anagrams-example-tutorial.html)如何查找字符串的所有排列?(https://javarevisited.blogspot.com/2015/08/how-to-find-all-permutations-of-string-java-example.html)如何利用遞歸反轉給定字符串?(https://javarevisited.blogspot.com/2012/01/how-to-reverse-string-in-java-using.html)如何檢查給定字符串是否是回文串?(https://www.java67.com/2015/06/how-to-check-is-string-is-palindrome-in.html)如何在查找不包含重複字符的最長子串的長度?給定字符串str,如何查找str中最長的回文子字符串?如何檢查字符串是否僅包含數字?(https://javarevisited.blogspot.com/2012/10/regular-expression-example-in-java-to-check-String-number.html)如何刪除鍊表末尾的第N個節點?(https://leetcode.com/problems/remove-nth-node-from-end-of-list/solution/)如何合併兩個排序的鍊表?如何將排序列錶轉換為二叉搜索樹?(https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/solution/)如何查找給定的字符串中的重複字符?(https://www.java67.com/2014/03/how-to-find-duplicate-characters-in-String-Java-program.html)如何統計給定字符串中的元音和輔音數量?(https://www.java67.com/2013/11/how-to-count-vowels-and-consonants-in-Java-String-word.html)如何在不使用任何庫方法的情況下反轉給定句子中的單詞?(https://www.java67.com/2015/06/how-to-reverse-words-in-string-java.html)如何檢查兩個字符串是否是彼此的旋轉?(https://www.java67.com/2017/07/string-rotation-in-java-write-program.html)如何將字節數組轉換為String?(https://javarevisited.blogspot.com/2014/08/2-examples-to-convert-byte-array-to-String-in-Java.html)如何從字符串中刪除給定字符?(https://www.java67.com/2013/03/how-to-replace-string-in-java-character-example.html)如何只遍歷一遍就查找出單鍊表的中間元素?(https://javarevisited.blogspot.com/2012/12/how-to-find-middle-element-of-linked-list-one-pass.html)如何檢查給定的鍊表是否包含循環?如何找到循環的起點?(https://javarevisited.blogspot.com/2013/05/find-if-linked-list-contains-loops-cycle-cyclic-circular-check.html)如何反轉連結列表?(https://www.java67.com/2016/07/how-to-reverse-singly-linked-list-in-java-example.html)如何在不使用遞歸的情況下反轉單連結列表?(https://javarevisited.blogspot.com/2017/03/how-to-reverse-linked-list-in-java-using-iteration-and-recursion.html)如何刪除未排序鍊表中的重複節點?(https://www.geeksforgeeks.org/remove-duplicates-from-an-unsorted-linked-list/)如何找出單向鍊表的長度?(https://javarevisited.blogspot.com/2016/05/how-do-you-find-length-of-singly-linked.html)如何查找單向鍊表中開頭的第三個節點?(https://javarevisited.blogspot.com/2016/07/how-to-find-3rd-element-from-end-in-linked-list-java.html)如何使用棧來計算兩個鍊表中元素的總和?(https://www.geeksforgeeks.org/sum-of-two-linked-lists/)數組和鍊表有什麼區別?(https://www.java67.com/2017/06/5-difference-between-array-and-linked.html)如何刪除排序鍊表中的重複項?(https://leetcode.com/problems/remove-duplicates-from-sorted-list/solution/)如何找出兩個單向鍊表從何處開始相交?(https://leetcode.com/problems/intersection-of-two-linked-lists/solution/)給定一個鍊表和一個值x,對鍊表進行分區,使所有小於x的節點排在大於或等於x的節點之前。(https://leetcode.com/problems/partition-list/solution/)如何檢查給定的鍊表是否是回文?如何從整數鍊表中刪除所有與給定值匹配的元素?如何實現二叉搜索樹?(https://javarevisited.blogspot.com/2015/10/how-to-implement-binary-search-tree-in-java-example.html#axzz4wnEtnNB3)如何在給定的二叉樹中執行前序遍歷?(https://javarevisited.blogspot.com/2016/07/binary-tree-preorder-traversal-in-java-using-recursion-iteration-example.html#axzz5ArdIFI7y)如何在不使用遞歸的前提下遍歷給定的二叉樹?(https://www.java67.com/2016/07/binary-tree-preorder-traversal-in-java-without-recursion.html)如何在給定的二叉樹中執行中序遍歷?(https://www.java67.com/2016/08/binary-tree-inorder-traversal-in-java.html)不使用遞歸,如何利用中序遍歷輸出給定二叉樹的所有節點?(https://www.java67.com/2016/08/binary-tree-inorder-traversal-in-java.html)如何實現後序遍歷算法?(https://www.java67.com/2016/10/binary-tree-post-order-traversal-in.html)如何在不使用遞歸的情況下後序遍歷二叉樹?(https://www.java67.com/2017/05/binary-tree-post-order-traversal-in-java-without-recursion.html)如何輸出二叉搜索樹的所有葉子?(https://www.java67.com/2016/09/how-to-print-all-leaf-nodes-of-binary-tree-in-java.html)如何計算給定二叉樹中的葉節點數量?(https://javarevisited.blogspot.com/2016/12/how-to-count-number-of-leaf-nodes-in-java-recursive-iterative-algorithm.html)如何在給定數組中執行二分搜索?(https://javarevisited.blogspot.com/2015/10/how-to-implement-binary-search-tree-in-java-example.html#axzz4wnEtnNB3)如何在不使用第三個變量的條件下交換兩個數字?(https://www.java67.com/2015/08/how-to-swap-two-integers-without-using.html)如何檢查兩個矩形是否有重疊?(https://javarevisited.blogspot.com/2016/10/how-to-check-if-two-rectangle-overlap-in-java-algorithm.html)如何設計一臺自動售貨機?(https://javarevisited.blogspot.com/2016/06/design-vending-machine-in-java.html)如何用你熟悉的程式語言實現LRU緩存?(https://javarevisited.blogspot.com/2017/07/top-10-linked-list-coding-questions-and.html#axzz5ArdIFI7y)如何檢查給定的數字是否是回文?(https://javarevisited.blogspot.com/2012/12/how-to-check-if-number-is-palindrome-or-not-example.html)如何檢查給定數字是否為阿姆斯特朗數?(https://www.java67.com/2012/07/java-program-to-find-armstrong-numbers.html)如何找到給定數字的所有質因數?(https://javarevisited.blogspot.com/2014/05/how-to-find-prime-factors-of-integer-number-java.html#axzz5E2uHdG3w)如何用Java檢查給定數字是正數還是負數?(https://javarevisited.blogspot.com/2013/01/how-to-check-if-number-is-positive-or-negative-java-example.html#axzz5E2uHdG3w)如何找到給定整數的最大質因數?(https://javarevisited.blogspot.com/2015/03/how-to-find-largest-prime-factor-of.html#axzz5E2uHdG3w)如何輸出不大於給定數字的所有質數?(https://javarevisited.blogspot.com/2012/04/java-program-to-print-prime-numbers-in.html#axzz5E2uHdG3w)如何輸出弗洛伊德三角形?(https://javarevisited.blogspot.com/2014/12/how-to-print-floyds-triangle-in-java.html)如何輸出帕斯卡三角形?(https://www.java67.com/2016/06/how-to-print-pascal-triangle-in-java.html)如何計算給定數字的平方根?(https://javarevisited.blogspot.com/2016/10/how-to-find-square-root-of-number-in-java-algorithm.html#axzz5E2uHdG3w)如何檢查給定數字是否為質數?(https://www.java67.com/2014/01/how-to-check-if-given-number-is-prime.html)如何Java中不使用加號將兩個數相加?(https://javarevisited.blogspot.com/2013/06/how-to-add-two-integer-numbers-without-plus-arithmetic-operator-java-example.html)如何在不使用算術運算符的情況下檢查給定數字是否為偶數/奇數?(https://www.java67.com/2012/07/how-to-find-even-and-odd-number-in-java-program.html)如何輸出給定的金字塔結構?(https://www.java67.com/2015/10/how-to-print-pyramid-pattern-in-java-example.html)如何從Java中的給定文件中找出重複次數最多的詞?(https://www.java67.com/2015/10/java-program-to-find-repeated-words-and-count.html)如何在Java中反轉給定的Integer?(https://www.java67.com/2015/08/how-to-reverse-integer-in-java-leetcode-solution.html)如何在Java中將十進位數轉換為二進位?(https://www.java67.com/2014/03/decimal-to-binary-conversion-in-java.html)如何在Java中檢查給定年份是否為閏年?(https://www.java67.com/2012/12/how-to-check-leap-year-in-java-program.html)如何在不使用遞歸的情況下實現二分搜索算法嗎?(https://javarevisited.blogspot.com/2018/06/binary-search-in-java-without-recursion.html)穩定和不穩定排序算法之間的區別是什麼?(https://javarevisited.blogspot.com/2017/06/difference-between-stable-and-unstable-algorithm.html)什麼是二叉樹的深度優先搜索算法?如何用迭代實現快速排序算法?(https://javarevisited.blogspot.com/2016/09/iterative-quicksort-example-in-java-without-recursion.html#axzz5ArdIFI7y)如何實現插入排序算法?(https://www.java67.com/2014/09/insertion-sort-in-java-with-example.html)如何實現歸併排序算法?(https://www.java67.com/2018/03/mergesort-in-java-algorithm-example-and.html)比較和非比較排序算法有什麼區別?(https://javarevisited.blogspot.com/2017/02/difference-between-comparison-quicksort-and-non-comparison-counting-sort-algorithms.html)如何實現求質數的埃拉託斯特尼篩法?(https://javarevisited.blogspot.com/2015/05/sieve-of-Eratosthenes-algorithm-to-generate-prime-numbers-in-java.html)如何找到總和最大的子數組?(https://www.educative.io/courses/grokking-the-coding-interview/JPKr0kqLGNP?affiliate_id=5073518643380224)我覺得以上問題就足應付編程面試了,但是如果你需要更多的編程問題,那麼可以從《 Cracking The Code Interview》一書中尋求幫助,這本書中包含189+個編程問題和解決方案。
結束語
這些是數據結構和算法之外的一些最常見的問題,可以幫助你在面試中有出色的表現。
無論大公司還是小公司,為了順利通過編程面試,你都需要掌握這些常見的編碼、數據結構和算法問題。
希望本文的101道考題能夠幫助你評估自己的準備工作,並發現自己的長處和短處。
編程面試當然不是一件容易的事,但是我們可以通過練習拉近與他人的差距。順便說一句,你的實戰經驗越多,準備得就會越充分。
感謝您閱讀本文,祝您面試順利!
原文:https://dev.to/javinpaul/101-coding-problems-and-few-tips-to-crack-your-next-programming-interviews-402a
本文為 CSDN 翻譯,轉載請註明來源出處。
【End】
CSDN雲計算TOP案例徵集開啟啦~~
你的「雲+X」方案夠先進嗎?夠高效嗎?能解決行業目前的問題並快速迭代嗎?想要更多人知道你的項目?請趕快掃碼提交方案,權益多多,請見下方海報啦!