作為程序員在面試的時(shí)候碰到的問(wèn)題還是很多的,不光要掌握像數(shù)組、鏈表、棧、隊(duì)列和樹(shù)這樣基本的數(shù)據(jù)結(jié)構(gòu),在面試中還會(huì)碰到數(shù)據(jù)結(jié)構(gòu)和算法問(wèn)題。所以小編在這里告訴大家,下面的面試題目很有可能被碰到,一起來(lái)看看吧!
1. 如何只掃描一遍就找到位于一個(gè)鏈表正中間的元素?
這是最受歡迎的算法題之一,經(jīng)常在電話面試中被問(wèn)到。很多程序員會(huì)想,要知道鏈表的長(zhǎng)度,就要先掃描一遍鏈表,然后在第二遍中取其正中的元素。所以被要求只掃描一遍就解決問(wèn)題的時(shí)候他們就會(huì)很困惑。要解決這個(gè)問(wèn)題,你要維護(hù)兩個(gè)指針。一個(gè)每次往下走一個(gè)結(jié)點(diǎn),而另一個(gè)每次走兩個(gè)結(jié)點(diǎn)。那么當(dāng)走的快的指針到達(dá)鏈表末尾時(shí),另一個(gè)指針就正好指在鏈表的正中間。
2. 如何確定一個(gè)鏈表中是否存在環(huán)?
這跟第一題有點(diǎn)類似。同樣地維護(hù)兩個(gè)指針,分別以每步一個(gè)結(jié)點(diǎn)和每步兩個(gè)結(jié)點(diǎn)的速度走,那么如果當(dāng)某一步結(jié)束以后兩個(gè)指針指向同一個(gè)結(jié)點(diǎn),就說(shuō)明我們找到了一個(gè)環(huán)。
3. 如何只掃描一遍就找到一個(gè)鏈表倒數(shù)第三個(gè)元素?
這也是一個(gè)很經(jīng)典的鏈表題,也可以用兩個(gè)指針的方法來(lái)解決。我們讓第一個(gè)指針先走,當(dāng)它走出三步以后再讓第二個(gè)指針開(kāi)始走。那么當(dāng)?shù)谝粋€(gè)指針到達(dá)鏈表的末尾時(shí),第二個(gè)指針就正好指向鏈表中的倒數(shù)第三個(gè)元素。
4. 如何找到一個(gè)含有 1~100 的數(shù)組中唯一出現(xiàn)兩次的元素?
這是一個(gè)挺簡(jiǎn)單的算法題。你可以把數(shù)組里面所有元素加起來(lái),再減去 1~100 的和,就能得到那個(gè)重復(fù)的元素。當(dāng)然你也可以暴力地去比對(duì)每一對(duì)元素,不過(guò)這樣的復(fù)雜度是 O(N^2)。
5. 如何在 Java 中反轉(zhuǎn)一個(gè)字符串?
這是我最喜歡的問(wèn)題之一。因?yàn)?String 是編程中最重要的類型之一,所以在技術(shù)面試中你會(huì)遇到許多跟字符串有關(guān)的問(wèn)題。Java 和其他編程語(yǔ)言都有許多不同的方式可以反轉(zhuǎn)一個(gè)字符串,所以面試官往往會(huì)禁止你使用某些特性,比如 reverse() 和 StringBuffer。之后他還可能會(huì)問(wèn)如何用遞歸來(lái)反轉(zhuǎn)字符串。
6. 如何用冒泡排序?qū)?shù)組進(jìn)行排序?
在技術(shù)面試中我總是會(huì)問(wèn)一些關(guān)于搜索和排序的問(wèn)題。冒泡排序是最簡(jiǎn)單的排序算法之一,但如果你讓一個(gè)候選人現(xiàn)場(chǎng)寫冒泡排序,這能夠很好地衡量他的編程技能。
7. 棧和隊(duì)列這兩種數(shù)據(jù)結(jié)構(gòu)之間的區(qū)別是什么?
這是一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu)問(wèn)題,應(yīng)該沒(méi)有人不知道的吧?不管怎么說(shuō),最主要的區(qū)別在于棧是后進(jìn)先出(LIFO),而隊(duì)列是先進(jìn)先出(FIFO)的。
8. 如何找到一個(gè)數(shù)組中所有重復(fù)出現(xiàn)的元素?
這個(gè)問(wèn)題有時(shí)會(huì)作為第 4 題的后續(xù)出現(xiàn)。解決這個(gè)問(wèn)題的一種途徑是使用哈希表。遍歷整個(gè)數(shù)組并將元素和出現(xiàn)次數(shù)存到哈希表中。最后你就可以統(tǒng)計(jì)那些出現(xiàn)超過(guò)一次的元素作為答案。在 Java 中,當(dāng)一個(gè)元素已經(jīng)在 HashMap 中時(shí),調(diào)用 get(index) 就可以得到對(duì)應(yīng)的值,否則會(huì)返回 Null。這個(gè)性質(zhì)可以用來(lái)插入和更新 HashMap 中的值。
9. 單向鏈表和雙向鏈表之間有什么差別?
這又是一個(gè)經(jīng)常在電話面試中被問(wèn)到的數(shù)據(jù)結(jié)構(gòu)題。單向鏈表和雙向鏈表之間主要的差別在于它們的可遍歷性不同。在單向鏈表中,每個(gè)結(jié)點(diǎn)只有指向下一個(gè)結(jié)點(diǎn)的指針,而沒(méi)有指向上一個(gè)結(jié)點(diǎn)的指針,所以你就不能倒回去遍歷。而雙向鏈表的結(jié)點(diǎn)則維護(hù)了兩個(gè)指針,往兩個(gè)方向都可以遍歷。
10. 如何打印斐波那契數(shù)列?
這是一個(gè)在面試中經(jīng)常出現(xiàn)的編程問(wèn)題。斐波那契數(shù)列是這樣的一種數(shù)列:它的每一項(xiàng)都等于前兩項(xiàng)之和,例如:1,1,2,3,5,8,13,21。面試官往往會(huì)關(guān)心這兩件事情:一個(gè)能夠返回斐波那契數(shù)列第 n 項(xiàng)的函數(shù),以及如何在 Java 中用遞歸解決這個(gè)問(wèn)題。雖然這個(gè)問(wèn)題很簡(jiǎn)單,但遞歸的部分可能會(huì)困惑一些初學(xué)者。
11. 如何判斷一個(gè)整數(shù)是不是回文數(shù)?
跟前一題一樣,這也不是一個(gè)算法題,但在面試中的出現(xiàn)率也很高。當(dāng)一個(gè)數(shù)反過(guò)來(lái)寫還是等于本身時(shí),我們稱之為回文數(shù)。面試官往往會(huì)要求你不使用 Java API 和第三方庫(kù)來(lái)解這個(gè)問(wèn)題。當(dāng)然,問(wèn)題本身不難。你只要會(huì)用 / 和 % 就能解決它。/ 能去掉最后一位,而 % 能得到最后一位。比如 1234 / 10 會(huì)得到 123,而 1234 % 10 則能得到 4。
12. 什么是二叉查找樹(shù)?
這是一個(gè)關(guān)于樹(shù)的數(shù)據(jù)結(jié)構(gòu)問(wèn)題。二叉查找樹(shù)滿足一些特殊的性質(zhì),比如說(shuō)每個(gè)結(jié)點(diǎn)的左子樹(shù)中的值都要比自身小,而右子樹(shù)中的值都要比自身大,等等。除了定義以外,面試官還可能讓你在 Java 中實(shí)現(xiàn)一棵二叉樹(shù)并詢問(wèn)關(guān)于樹(shù)的遍歷的問(wèn)題。比如中序遍歷、先序遍歷和后序遍歷之間的區(qū)別。
13. 如何分別用遞歸和非遞歸方式倒置一個(gè)鏈表?
這是一個(gè)非常好的數(shù)據(jù)結(jié)構(gòu)題,所以我希望你自己去思考。當(dāng)然你也能輕易地在網(wǎng)上找到許多解法。
14. 如何用 Java 實(shí)現(xiàn)一個(gè)棧?
你可以用數(shù)組或者鏈表來(lái)實(shí)現(xiàn)棧。這個(gè)問(wèn)題期望你實(shí)現(xiàn)棧所提供的標(biāo)準(zhǔn)接口,也就是 push()和 pop()。這兩個(gè)操作都應(yīng)該發(fā)生在棧的頂部。當(dāng)然,如果你能實(shí)現(xiàn) contains() 和 isEmpty() 這樣的功能就更好了。順便一提,你可以利用 JDK 提供的 java.util.Stack 來(lái)學(xué)習(xí)怎么實(shí)現(xiàn)一個(gè)棧。
Java程序員最可能被考到的面試題到這里就給大家介紹完了,希望能幫助到大家,如果小編有不足之處歡迎大家補(bǔ)充哦!
聯(lián)系客服