筆試部分是作了10道題目, 主要是相似於LeetCode上的題. 也包含了一些設計題目, 好比說怎麼設計一個爬蟲系統的去重. 在面試的時候答題紙也被送過來, 面試官會選擇裏面一個問題(主要是沒作出來的)來問你.面試
題目我會記錄下來放到GitHub上.數據庫
一面聊的時間很長, 總共70分鐘左右.編程
總共問了三個大題吧. 發如今面試的過程當中, 有一些問題是一開始沒有思考到的, 在交流想法的時候發現漏掉了. 多是沒有一開始去設計測試用例, 或者去思考當前的可能的場景或者狀況.數組
一開始作了一個設計的題目. 場景是一些關鍵操做, 要對用戶的訪問次數或者訪問時間作出限制. 給出的例子是要設計一個函數或者功能, 限制單一用戶在60分鐘以內不能訪問超過5詞以上. 相似實現一個函數, 輸入是用戶的 uid. 返回一個布爾值用於表示是否應該 block 掉該次訪問.數據結構
當時一開始的想法是把記錄存在一個數據庫表裏, 相似<訪問時間, uid, 狀態(block/OK)>
而後每次去數據庫查, 獲取到當前的60分鐘以內的數據, 大於5條就選擇block掉.編程語言
後來以爲放在MySQL這種數據庫中太慢, 由於這個函數確定是一個熱點, 在每次接受請求的時候都會調用. 能夠放在Redis這種內存數據庫中.函數
此外, 因爲這種規則的限制只考慮好比 x 分鐘以內的記錄. 能夠只保存必定時間以內的訪問記錄, 超時就作一個失效的處理.源碼分析
後來要求用一種數據結構實現, 在內存中直接計算.測試
發現能夠作一個HashMap的形式, 裏面保存的是 uid和一個表示訪問記錄的隊列.這個隊列裏保存一些過去的訪問記錄. 能夠經過時間和數量來選擇最大的容量.ui
好比說我如今須要考慮過去60分鐘的5次數據. 我能夠選擇容量是5, 最多容納五條.我直接選取隊列中最先插入的(時間距離如今最久)看這條記錄時間是否比當前時間早60分鐘. 若是超過了就說明最近60分鐘的訪問次數少於5次. 若是沒超過說明需求被block.
在每次接受請求的時候都須要把訪問記錄放到這個隊列中, 也就是會退出一個最先插入的, 再在隊尾加一個當前的訪問記錄.
在手寫代碼的時候發現沒有思考冷啓動的問題, 須要判斷若是隊列不滿, 就應該直接放入數據.這也是考慮欠穩當的地方.
第二個問題, 面試官問我是否瞭解 HashMap . 其實不很瞭解, 沒看過源代碼, 看過一些文章.說了一下鏈表過長會樹化,有開放尋址和鏈表法解決Hash衝突的問題. 而後問我map裏桶的數組保存的是什麼, 我說是鏈表的頭結點. 面試以後看了一下源碼分析的文章, 其實map裏就是保存了一個 Entry的數組, 每一個Entry有指向下一個Entry的引用, 也就是一種鏈表的數組. 好像還問我何時擴容, 這個我答的不對. 後來看過是在map的大小超過閾值以後, 且發生了Hash衝突,才擴容. 在沒超過閾值, 可是某個鏈表長度過長的時候發生樹化.
第三個問題是問相似一個Linux的目錄樹, 怎麼從[父目錄, 子目錄]這種信息構建出來.
提供的數據[[A,B],[B,C],[C,D],[D,E]] 這種, 構建出相似 Linux tree命令的結果.
須要考慮怎麼構建樹形結構, 還要考慮怎麼能從樹輸出結果.
二面感受面的很差, 不少問題都沒回答上來.