程序员面试算法_程序员的前20个搜索和排序算法面试问题
程序員面試算法
大家好,如果您正在準(zhǔn)備編程工作面試或正在尋找新工作,那么您知道這不是一個(gè)容易的過程。 在您職業(yè)的任何階段,您都必須幸運(yùn)地接到電話并進(jìn)行第一輪面試,但是在初學(xué)者方面,當(dāng)您尋找第一份工作時(shí)就更加困難。 這就是為什么您不能只是輕率抓住機(jī)會(huì)。 您必須準(zhǔn)備抓住這個(gè)機(jī)會(huì),為此,您必須知道在面試中您期望得到的機(jī)會(huì)。
問什么,您應(yīng)該準(zhǔn)備什么主題,等等? 我已經(jīng)在博客上寫了很多關(guān)于您可以在此博客中找到有用文章的文章,但回顧一下,讓我告訴您,除了數(shù)據(jù)結(jié)構(gòu)問題 , 系統(tǒng)設(shè)計(jì)問題以及特定于編程語言的問題(如Java或Scala)之外 ,大多數(shù)編程工作面試也詢問基于算法的問題。
這些基于常見的搜索和排序算法,例如
二進(jìn)制搜索 , 圖算法等。 練習(xí)這些基于算法的問題很重要,因?yàn)榧词顾鼈兛雌饋砗苊黠@且容易,但有時(shí)在實(shí)際面試中很難解決,特別是如果您從未親自編碼過。
之前已經(jīng)練習(xí)過它們,不僅使您熟悉它們,而且使您更有信心向面試官解釋解決方案,這在選擇中起著非常重要的作用。 它還使您為任何棘手的問題和替代性問題做好了準(zhǔn)備,例如采訪者經(jīng)常想讓您使用遞歸或迭代來解決特定的編碼問題。
有時(shí),如果使用的數(shù)據(jù)結(jié)構(gòu)類似于我在String上查找重復(fù)字符所使用的數(shù)據(jù)結(jié)構(gòu),則它們會(huì)要求您解決該問題而不使用Set數(shù)據(jù)結(jié)構(gòu)。 那只是一些常見的例子,這就是為什么實(shí)踐很重要的原因。
來自編碼面試的20多種搜索和排序算法問題
無論如何,這是一些來自訪談的常見搜索和排序算法問題:
1.您可以實(shí)現(xiàn)二進(jìn)制搜索算法嗎? ( 解決方案 )
二進(jìn)制搜索很容易,它是一種分而治之的算法,該算法將問題分為子問題,并加以解決。 這是一種搜索算法,因此可用于查找整數(shù)數(shù)組中的數(shù)字或目錄中的項(xiàng)目。
實(shí)現(xiàn)二進(jìn)制搜索算法的最簡單方法是使用遞歸,這是解決方案鏈接所包含的內(nèi)容,但是在查看解決方案之前,您應(yīng)該自己嘗試一下。
值得一提的是輸入必須排序,我的意思是只能在排序數(shù)組中實(shí)現(xiàn)二進(jìn)制搜索。
2.編寫程序以實(shí)現(xiàn)線性搜索算法? ( 解決方案 )
它甚至比二進(jìn)制搜索更容易,您所需要做的就是使用for循環(huán)或遞歸方法遍歷數(shù)組中的所有元素,并將每個(gè)元素與要搜索的元素進(jìn)行比較。 當(dāng)元素匹配時(shí),根據(jù)您的要求返回索引或true / false。
例如,如果您正在編寫一個(gè)contains()方法,則可以返回true或false來指示數(shù)組中是否存在元素。 由于需要掃描整個(gè)數(shù)組以查找元素,因此該算法的時(shí)間復(fù)雜度為O(n)。
3.是否可以實(shí)現(xiàn)沒有遞歸的二進(jìn)制搜索算法? ( 解決方案 )
您可能知道,可以通過使用循環(huán)或有時(shí)使用堆棧來將遞歸算法替換為迭代算法。 對(duì)于二進(jìn)制搜索,您也可以執(zhí)行此操作,只需將數(shù)組劃分并比較中間元素,直到找到目標(biāo)元素或數(shù)組中沒有其他元素為止。 如果目標(biāo)元素大于中間元素,則必須向右移動(dòng),否則向左移動(dòng)。
4.編寫代碼以在二叉樹中實(shí)現(xiàn)級(jí)別順序搜索? (解)
在級(jí)別順序搜索中,您首先要訪問同級(jí)節(jié)點(diǎn),而不是進(jìn)入下一個(gè)級(jí)別。 您可以使用Queue在二叉樹中實(shí)現(xiàn)級(jí)別順序搜索。如果您想了解更多信息,可以在freeCodeCamp上查看所有這些免費(fèi)數(shù)據(jù)結(jié)構(gòu)和算法課程 。
5.實(shí)現(xiàn)冒泡排序算法? ( 解決方案 )
這不是您學(xué)習(xí)的第一個(gè)排序算法嗎? 好吧,我做到了,這就是為什么我記得冒泡排序是關(guān)于將數(shù)組中的每個(gè)數(shù)字與其他數(shù)字進(jìn)行比較,以便在每次傳遞最大或最小元素后冒泡到頂部。 我的意思是發(fā)現(xiàn)它已按排序順序放置。 這是基本算法之一,其時(shí)間復(fù)雜度為O(n ^ 2),這使得它無法用于大量數(shù)字,但對(duì)于少量數(shù)字卻表現(xiàn)出色。
6.穩(wěn)定和不穩(wěn)定排序算法之間的區(qū)別? ( 回答 )
這是一個(gè)棘手的概念,直到很久以前我才知道。 我還沒有遇到過這種情況的任何實(shí)際用例,但是只是從訪談的角度知道這個(gè)概念還可以。 在穩(wěn)定的排序算法中,即使排序后,同一元素的順序也保持不變,但是在不穩(wěn)定的排序算法中,這會(huì)發(fā)生變化。 一個(gè)很好的例子是快速排序和合并排序,其中前者不穩(wěn)定,而后者則是穩(wěn)定算法。
7.什么是二叉樹的深度優(yōu)先搜索算法? (解)
這是另一種流行的搜索算法,主要用于樹和圖形。 該算法首先在相同級(jí)別搜索之前先深入訪問節(jié)點(diǎn),這就是為什么使用深度優(yōu)先搜索算法的原因。 實(shí)施起來很棘手,但是您可以使用Stack來實(shí)現(xiàn)DFS或深度優(yōu)先搜索算法。
8.如何實(shí)現(xiàn)迭代快速排序算法? ( 解決方案 )
顯然沒有遞歸:-)。 如果您還記得,我之前曾告訴過您,您可以使用Stack將遞歸算法轉(zhuǎn)換為迭代算法,這也是在不遞歸的情況下實(shí)現(xiàn)Quicksort算法的方法。 如果您需要有關(guān)實(shí)施的更多幫助,則可以進(jìn)一步查看該解決方案。
9.如何實(shí)現(xiàn)計(jì)數(shù)排序算法? ( 解決方案 )
就像我們對(duì)其他O(n)排序算法(例如Radix排序和Bucket排序)所做的一樣。 如果您不知道Counting sort是另一種整數(shù)排序算法,則可以根據(jù)較小整數(shù)的鍵對(duì)對(duì)象集合進(jìn)行排序。 它具有O(n)時(shí)間復(fù)雜度,使其比喜歡的速度更快 Quicksort和Mergesort用于一組特定的輸入。 有關(guān)更多詳細(xì)信息,請(qǐng)參見解決方案。
10.如何在不使用第三個(gè)變量的情況下交換兩個(gè)數(shù)字? ( 解決方案 )
另一個(gè)棘手的問題,如果您知道竅門,這很容易:-)如果您可以將一個(gè)數(shù)字存儲(chǔ)在一個(gè)數(shù)字中,然后將其減去其他數(shù)字,則可以在不使用臨時(shí)變量或第三個(gè)變量的情況下交換兩個(gè)數(shù)字
a = 3;
b = 5;
a = a + b; // 8
b = a-b; // 3 a = a — b; // 5
現(xiàn)在您有a = 5和b = 3,因此無需使用第三個(gè)或temp變量就可以交換數(shù)字。
11.如何實(shí)現(xiàn)基數(shù)排序算法? ( 解決方案 )
這是另一種具有O(n)時(shí)間復(fù)雜度的整數(shù)排序算法。 根據(jù)Wikipedia,Radix排序是一種非比較排序算法 ,該算法通過按共享相同有效位和值的單個(gè)數(shù)字對(duì)鍵進(jìn)行分組,從而使用整數(shù)鍵對(duì)數(shù)據(jù)進(jìn)行排序 。 您可以進(jìn)一步查看該解決方案以了解實(shí)施細(xì)節(jié)。
12.如何實(shí)現(xiàn)插入排序算法? ( 解決方案 )
您是否曾經(jīng)在您的櫥柜中布置了撲克牌或襯衫? 這兩件事之間有什么共同點(diǎn)? 好吧,您將下一張卡片或襯衫放到適當(dāng)?shù)奈恢?#xff0c;或者,我應(yīng)該說您將下一個(gè)元素插入其適當(dāng)?shù)奈恢谩?這就是您的插入方式。
13.編寫算法以檢查兩個(gè)矩形是否相互重疊? ( 解決方案 )
這是一個(gè)棘手的算法問題,但是如果您必須在2D數(shù)學(xué)課上聽老師講課,則可以解決此問題。 還有另一個(gè)技巧,檢查矩形不重疊時(shí)的所有條件,如果條件不成立,則意味著兩個(gè)矩形都重疊。 例如,如果一個(gè)矩形的上側(cè)低于其他矩形的下側(cè),則它們?cè)诖怪睂?duì)齊時(shí)不會(huì)重疊。
14.合并排序算法如何實(shí)現(xiàn)? ( 解決方案 )
與快速排序類似,合并排序也進(jìn)行了劃分和征服算法,即您可以對(duì)數(shù)組進(jìn)行劃分,直到可以對(duì)數(shù)組中的最小數(shù)組進(jìn)行排序,例如具有一個(gè)或零元素的數(shù)組。 對(duì)小數(shù)組進(jìn)行排序后,可以將它們合并以獲得最終結(jié)果。
Quicksort和Mergesort之間的唯一區(qū)別是mergesort是穩(wěn)定的,而Quicksort是不穩(wěn)定的。 這意味著相等元素在排序前后保留其位置。
另一個(gè)值得注意的區(qū)別是,即使兩者均具有O(NLogN)的平均時(shí)間,使用Quicksort比mergesort更好,因?yàn)閷?duì)于相同數(shù)量的輸入,Quicksort花費(fèi)的時(shí)間更少,而Quicksort中的常數(shù)因子比merge sort少。
15.如何實(shí)現(xiàn)存儲(chǔ)桶排序算法? ( 解決方案 )
Bucket排序是另一種很棒的算法,可以對(duì)數(shù)組進(jìn)行排序,甚至不比較元素。 它被稱為非比較排序算法,可以為所選輸入提供O(n)性能。
16.編寫算法來檢查兩個(gè)字符串是否為字母( 解決方案 )
字謎是長度和字符匹配但順序不匹配的東西,例如Army和Mary都具有相同數(shù)量的字符。 解決此問題的一個(gè)技巧是對(duì)字符進(jìn)行排序并檢查它們是否相同。
17.用您喜歡的編程語言實(shí)現(xiàn)QuickSort算法嗎? ( 解決方案 )
這是一種非常簡單的排序算法,但是只有當(dāng)您練習(xí)過之后,否則您可能會(huì)迷路。 請(qǐng)記住,Quicksort是一個(gè)分而治之的算法,這意味著您可以保持?jǐn)?shù)組的劃分,也稱為分區(qū)。 然后,您可以在最小級(jí)別上解決問題,也稱為基本案例,例如您的數(shù)組僅包含一個(gè)或零個(gè)元素時(shí)。
18.如何檢查兩個(gè)String是否相互旋轉(zhuǎn)? ( 解決方案 )
有一個(gè)簡單的技巧可以解決此問題,只需將String與自身連接起來,然后檢查旋轉(zhuǎn)是否存在。 如果串聯(lián)的String包含旋轉(zhuǎn),則給定的String是前者的旋轉(zhuǎn)。
19,比較和非比較排序算法之間的區(qū)別? ( 回答 )
顧名思義,在基于比較的排序算法中,您必須像對(duì)快速排序一樣對(duì)元素進(jìn)行排序,但是在諸如計(jì)數(shù)排序之類的非基于比較的排序算法中,可以不對(duì)元素進(jìn)行比較。 驚訝嗎 好吧,那么,我建議您閱讀本課程,以了解有關(guān)O(n)排序算法的更多信息,例如基數(shù)排序,計(jì)數(shù)排序和存儲(chǔ)桶排序。
20.實(shí)現(xiàn)素?cái)?shù)的Eratosthenes算法篩? ( 解決方案 )
這是難以實(shí)施的算法之一,特別是如果您不記得的話:-)有時(shí)候面試官會(huì)給您解釋,而其他時(shí)候您需要記住它。
這些是數(shù)據(jù)結(jié)構(gòu)和算法之外的一些最常見問題,可幫助您在面試中表現(xiàn)出色。
我在博客上也分享了很多這些問題,因此,如果您真的很感興趣,可以隨時(shí)去那里搜索。
這些常見的編碼, 數(shù)據(jù)結(jié)構(gòu)和算法問題是您要成功采訪任何規(guī)模的任何公司(不論大小)都需要知道的問題 。
如果您正在尋找2019年的編程或軟件開發(fā)工作,則可以使用此編碼問題列表開始準(zhǔn)備工作。
此列表提供了準(zhǔn)備的好主題,還有助于評(píng)估您的準(zhǔn)備工作,以找出您的長處和短處。
良好的數(shù)據(jù)結(jié)構(gòu)和算法知識(shí)對(duì)于成功編寫采訪面試至關(guān)重要,因此您應(yīng)該集中精力進(jìn)行大部分工作。
結(jié)束語
謝謝,您到了本文的結(jié)尾……祝您編程采訪順利! 這當(dāng)然不會(huì)很容易,但是通過遵循此搜索和排序算法問題,您將比其他人邁出一步。
如果你喜歡這篇文章,那么請(qǐng)一起分享你的朋友和同事,不要忘記遵循javarevisited Twitter和javinpaul以及!
翻譯自: https://www.javacodegeeks.com/2019/04/searching-sorting-algorithms-interview-questions-programmers.html
程序員面試算法
總結(jié)
以上是生活随笔為你收集整理的程序员面试算法_程序员的前20个搜索和排序算法面试问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 文件存在却找不到(linux
- 下一篇: 构造函数调用默认构造函数_显式无参数构造