1. 程式人生 > >百度一面Java後端開發

百度一面Java後端開發

百度一面

期待好久了,無論如何,過去的和現在的,在所不辭。 –RuiDer
2018-09-19 19:30~~2018-09-19 20:30

面試主要包括以下幾個方面
資料結構和演算法
Java基礎

面試具體細節問題

沒有自我介紹,直接入題
資料結構和演算法:

  1. 你知道如何判斷一個連結串列是否有環,詳細描述一下思路,實現一下(快慢指標的使用)

  2. 你知道如何找到一個連結串列環的入口,說說思路,實現一下(環的長度以及快慢指標的使用)

  3. 現在有一些你n+1個數字(0<x<n),這些數字中有且僅有一個數字重複了,不僅僅重複一次
    問如何找到這個數字?有幾種思路說幾種思路。

    推薦演算法
    思路一:迴圈遍歷,找到重複的數字
    思路二:使用一個棧,每個入棧元素與棧頂元素比較是否相等,如果相等即找到了。

面試官之後問思路一和思路二各自的時間複雜度和空間複雜度,並且要求實現一下。

  1. 給你一個二叉搜尋樹A,現在是這樣的,實現另外一個二叉樹B,結構與A二叉樹的結構相同,
    將該B二叉樹的每個節點與A二叉樹的每個節點對應起來,結構不變,只是每個節點的權值變
    化了。權值變化的原則是從A二叉樹中找到大於任意一個節點權值的所有節點,將這些節點
    的權值相加存入到B二叉樹對應節點中。
    說說你的思路,如何實現?

我的回答:兩重迴圈,實現對樹的遍歷,找到大於每個節點的權值並相加,儲存到B二叉樹中。
面試官問了我時間複雜度和空間複雜度。表示很失望。。有提示我這個二叉樹是二叉搜尋樹,
再想想其他更好的方法。。

我的回答:基於我的第一個想思路,將整個樹的遍歷侷限在每個節點的左子樹上,因為二叉搜尋
樹左節點的權值總是大於右節點的權值。
面試管又問我時間複雜度和空間複雜度。。

!!二叉樹沒有實現

Java基礎:

  1. 你知道Java最常用的一些集合吧?
    Collection、List、Set、Map等

  2. 那你知道ArrayList和LinkedList的區別吧?

  3. 說到ArrayList,你知道當ArrayList插入很多條資料時,底層陣列如何做出擴容?
    參考答案
    我說到了闕值,然後如何擴容的過程,建議看看ArrayList原始碼,尤其是擴容這裡,自己敲一遍,
    我是之前自己實現過,所以…

  4. 你知道ArrayList這個闕值怎麼來的嗎?還有擴容擴多少?
    參考答案
    首先是1.5倍,不滿足則預設ArrayList最大值,還不滿足就Integer.MAX_VALUE
    我忘了原始碼的實現,自己按照自己的理解解釋了下。

  5. 說說HashMap吧,你知道HashMap的插入和查詢的機制嗎?
    從頭到尾,建議將HashMap的原理解釋清楚,從鍵值對開始,包括hashCode()和equals(),
    底層實現,陣列以及連結串列等等

  6. 那你知道HashMap如何解決hash碰撞吧?
    參考答案
    雜湊碰撞問題:…建議說的詳細點,面試官不會認為你說的太多的,,在這我就不囉嗦
    了,希望讀者自己研究
    HashMap如何解決雜湊碰撞問題:當大量資料湧入同一個HashMap時,如果這些資料的hash值
    一樣,就會使得HashMap變成了一個連結串列,連結串列有優點,也有缺點,利於插入和刪除,不利於
    查詢。那麼HashMap的解決方式就是根據底層陣列的每個單元的闕值來判斷,當插入的資料數量
    達到闕值時,陣列進行擴容,而HashMap的hash函式計算hash值是根據陣列容量大小計算的,
    陣列容量變化,會發生元素的重新插入,且插入HashMap的位置也會發生變化,阻止了hash碰撞
    的可能。

  7. HashMap是執行緒安全的嗎?舉個例子解釋一下。

  8. HashMap如何實現執行緒安全?

  9. i++為什麼不是執行緒安全的?詳細解釋一下
    i++的三大步驟,獲取,自加,返回值 沒有加鎖,三句表示式,當有多個執行緒訪問時,發生
    上下文切換時,上一個執行的執行緒還未執行完整個i++過程就被掛起,下一個執行緒得到執行權
    訪問i,並執行i++,會發生資料的安全問題。

  10. 那你如何避免i++執行緒安全問題?說說你的想法
    我從兩個方面說了
    (1)併發量小的時候,使用悲觀鎖Syschornized或者Lock
    (2)併發量大的時候,使用樂觀鎖,具體實現是,將i++計數器封裝為一個物件,物件包括另外
    一個屬性int version,當訪問計數器時,得到i和version,線上程執行完i++後比較
    當前的version是否相等,如果相等執行version++,否則,操作失敗。

  11. 問點異常方面的問題,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,具體細節讀者自行
    研究。

  12. 內部類的變數在JDK1.8之前要求加上final修飾,JDK1.8之後預設為final,為什麼?

13.補充:還問到HashMap預設陣列大小 以及預設載入因子。,預設初始容量為16,預設載入因子為0.75。

關於HashMap,看看這篇博文

我記得就是這些,問題還是比較簡單和基礎,但是需要靜下心在邏輯上表達清楚。
希望能在百度與你同肩並戰!

About Me

相互學習

個人部落格