百度一面Java後端開發
百度一面
期待好久了,無論如何,過去的和現在的,在所不辭。 –RuiDer
2018-09-19 19:30~~2018-09-19 20:30
- 面試主要包括以下幾個方面
- 資料結構和演算法
- Java基礎
面試具體細節問題
沒有自我介紹,直接入題
資料結構和演算法:
-
你知道如何判斷一個連結串列是否有環,詳細描述一下思路,實現一下(快慢指標的使用)
-
你知道如何找到一個連結串列環的入口,說說思路,實現一下(環的長度以及快慢指標的使用)
-
現在有一些你n+1個數字(0<x<n),這些數字中有且僅有一個數字重複了,不僅僅重複一次
問如何找到這個數字?有幾種思路說幾種思路。
思路一:迴圈遍歷,找到重複的數字
思路二:使用一個棧,每個入棧元素與棧頂元素比較是否相等,如果相等即找到了。
面試官之後問思路一和思路二各自的時間複雜度和空間複雜度,並且要求實現一下。
- 給你一個二叉搜尋樹A,現在是這樣的,實現另外一個二叉樹B,結構與A二叉樹的結構相同,
將該B二叉樹的每個節點與A二叉樹的每個節點對應起來,結構不變,只是每個節點的權值變
化了。權值變化的原則是從A二叉樹中找到大於任意一個節點權值的所有節點,將這些節點
的權值相加存入到B二叉樹對應節點中。
說說你的思路,如何實現?
我的回答:兩重迴圈,實現對樹的遍歷,找到大於每個節點的權值並相加,儲存到B二叉樹中。
面試官問了我時間複雜度和空間複雜度。表示很失望。。有提示我這個二叉樹是二叉搜尋樹,
再想想其他更好的方法。。
我的回答:基於我的第一個想思路,將整個樹的遍歷侷限在每個節點的左子樹上,因為二叉搜尋
樹左節點的權值總是大於右節點的權值。
面試管又問我時間複雜度和空間複雜度。。
!!二叉樹沒有實現
Java基礎:
-
你知道Java最常用的一些集合吧?
Collection、List、Set、Map等 -
那你知道ArrayList和LinkedList的區別吧?
-
說到ArrayList,你知道當ArrayList插入很多條資料時,底層陣列如何做出擴容?
參考答案
我說到了闕值,然後如何擴容的過程,建議看看ArrayList原始碼,尤其是擴容這裡,自己敲一遍,
我是之前自己實現過,所以… -
你知道ArrayList這個闕值怎麼來的嗎?還有擴容擴多少?
參考答案
首先是1.5倍,不滿足則預設ArrayList最大值,還不滿足就Integer.MAX_VALUE
我忘了原始碼的實現,自己按照自己的理解解釋了下。 -
說說HashMap吧,你知道HashMap的插入和查詢的機制嗎?
從頭到尾,建議將HashMap的原理解釋清楚,從鍵值對開始,包括hashCode()和equals(),
底層實現,陣列以及連結串列等等 -
那你知道HashMap如何解決hash碰撞吧?
參考答案
雜湊碰撞問題:…建議說的詳細點,面試官不會認為你說的太多的,,在這我就不囉嗦
了,希望讀者自己研究
HashMap如何解決雜湊碰撞問題:當大量資料湧入同一個HashMap時,如果這些資料的hash值
一樣,就會使得HashMap變成了一個連結串列,連結串列有優點,也有缺點,利於插入和刪除,不利於
查詢。那麼HashMap的解決方式就是根據底層陣列的每個單元的闕值來判斷,當插入的資料數量
達到闕值時,陣列進行擴容,而HashMap的hash函式計算hash值是根據陣列容量大小計算的,
陣列容量變化,會發生元素的重新插入,且插入HashMap的位置也會發生變化,阻止了hash碰撞
的可能。 -
HashMap是執行緒安全的嗎?舉個例子解釋一下。
-
HashMap如何實現執行緒安全?
-
i++為什麼不是執行緒安全的?詳細解釋一下
i++的三大步驟,獲取,自加,返回值 沒有加鎖,三句表示式,當有多個執行緒訪問時,發生
上下文切換時,上一個執行的執行緒還未執行完整個i++過程就被掛起,下一個執行緒得到執行權
訪問i,並執行i++,會發生資料的安全問題。 -
那你如何避免i++執行緒安全問題?說說你的想法
我從兩個方面說了
(1)併發量小的時候,使用悲觀鎖Syschornized或者Lock
(2)併發量大的時候,使用樂觀鎖,具體實現是,將i++計數器封裝為一個物件,物件包括另外
一個屬性int version,當訪問計數器時,得到i和version,線上程執行完i++後比較
當前的version是否相等,如果相等執行version++,否則,操作失敗。 -
問點異常方面的問題,try{}catch{}finally{}語句中的return怎麼返回資料?比如以下程式碼
try{
x=1;
return x;
}
catch(Exception e){
x=2;
return x;
}
finally{
x=3;
return x;
}
這種題記住一點,finally語句肯定會被執行,先catch後finally最後return,具體細節讀者自行
研究。 -
內部類的變數在JDK1.8之前要求加上final修飾,JDK1.8之後預設為final,為什麼?
13.補充:還問到HashMap預設陣列大小 以及預設載入因子。,預設初始容量為16,預設載入因子為0.75。
關於HashMap,看看這篇博文
…
我記得就是這些,問題還是比較簡單和基礎,但是需要靜下心在邏輯上表達清楚。
希望能在百度與你同肩並戰!
About Me
相互學習