二、數據結構
部分一:
1、圖有幾種存儲方式?鄰接矩陣與鄰接表存儲結構的優缺點?什麼時候用什麼結構?
2、(1)排序算法哪些是穩定排序?歸併排序常用於哪裏?
(2)你所知道的最快的排序算法?
(3)若在數據庫底層進行排序,該如何設計排序算法?
(4)快排的思路,手寫快排
(5)堆排序
(6)排序算法
(7)希爾排序
(8)O(nlogn)的排序算法,選一個(寫的堆排)
(9)知道的所有排序,及其時空複雜度和是否穩定
(10)排序爲什麼分穩定不穩定
(11)設計一個排序類,你會選用哪種排序算法,爲什麼
常用排序的時間複雜度和優缺點
(12) 那你說下排序算法吧
- 這個也是我之前仔細研究過的。我把經典的八大排序的原理、時間複雜度、空間複雜度、穩定性都仔細說了一遍。(注意不要直接說答案,最好是能分享,這樣面試官才知道你是真正理解了)
- 我還回答了通排序(基數排序、計數排序)的原理以及和八大排序做了對比。
2、查找的複雜度
查找算法
3、(1)手寫斐波那契數列?
(2)爲什麼不用遞歸?遞歸有什麼不好?那爲什麼不用inline來寫遞歸呢?如何來避免遞歸?
4、網絡字節序與主機字節序的區別?爲何要有這樣的區別?
5、內存對齊,爲什麼要內存對齊
6、常見的頁面置換算法?
7、(1)循環與遞歸的區別
(2)什麼是遞歸,遞歸的幾個條件?寫遞歸要注意些什麼?
8、二叉樹給出前序,中序求後序
9、字符串匹配,O(n+m)
字符串匹配(可以用KMP),本人寫的KMP
10、給一個單鏈表如何判斷有環?
11、用什麼數據結構保存cookie
12、手寫vector刪除元素,需要注意迭代器失效情況。
13、一致性哈希
14、(1)如何判斷一個圖是否有環
(2)如何判斷一個單鏈表是否有環?
15、(1)紅黑樹查找、刪除、增加的複雜度,爲什麼?
(2)紅黑樹 特性和與AVL數比較 B樹比較
16、哈希表
17、堆結構
18、(1)二叉排序樹的插入算法(手寫)
(2)二叉樹先序遍歷(手寫)
19(1)鏈表判斷環的入口
(2)怎麼判斷兩個鏈表是否相交
20、 java 幾種修飾符 的區別
21、說一下對B+樹的瞭解
22、 索引有哪些?分別有什麼特點?
23、 HashMap問題
針對HashMap中某個Entry鏈太長,查找的時間複雜度可能達到O(n),怎麼優化?
當時說了可能是容量或者hash算法的原因,說了擴容,尋找好的hash算法替代,然後面試官說不是這兩個原因造成的,當時LZ也不知道JDK8中是採用紅黑樹進行處理的,就想不是爲了降低查找時間複雜度嗎,就說了用有序數組存儲鏈表的數據,也就想到用有序數組查找的時間複雜度爲O(nlogn )來解決,也是病急亂投醫吧,最後面試官說也算是一種方法吧。
24、拓撲排序思想
25、 hash衝突的四種辦法
26、中序遍歷的非遞歸做法?引出BFS和DFS的區別
27、什麼情況會棧溢出
28、B+樹和二叉樹查找時間複雜度
29、常用的hash算法有哪些
30、如果想實現一個線程安全的隊列,可以怎麼實現?
JUC包裏的ArrayBlockingQueue
還有LinkedBlockingQueue啥的又結合源碼說了一通。
部分二:
1. 鏈表與數組。
2.隊列和棧,出棧與入棧。
3. 鏈表的刪除、插入、反向。
4. 字符串操作。
5. Hash表的hash函數,衝突解決方法有哪些。
6. 各種排序:冒泡、選擇、插入、希爾、歸併、快排、堆排、桶排、基數的原理、平均時間複雜度、最壞時間複雜度、空間複雜度、是否穩定。
7. 快排的partition函數與歸併的Merge函數。
8. 對冒泡與快排的改進。
9. 二分查找,與變種二分查找。
10. 二叉樹、B+樹、AVL樹、紅黑樹、哈夫曼樹。
11. 二叉樹的前中後續遍歷:遞歸與非遞歸寫法,層序遍歷算法。
12. 圖的BFS與DFS算法,最小生成樹prim算法與最短路徑Dijkstra算法。
13. KMP算法。
14. 排列組合問題。
15. 動態規劃、貪心算法、分治算法。(一般不會問到)
16. 大數據處理:類似10億條數據找出最大的1000個數.........等等
部分三:
1、給你一萬個數,如何找出裏面所有重複的數?用所有你能想到的方法,時間複雜度和空間複雜度分別是多少?
2、給你一個數組,如何裏面找到和爲K的兩個數?
3、100000個數找出最小或最大的10個?
4、一堆數字裏面繼續去重,要怎麼處理?
5、利用數組,實現一個循環隊列類
6、 從N個無序數中尋找Top-k個最小數( 經典海量數據 )?
7、1G的內存可以裝入2G的程序麼?怎麼裝?
8、n級臺階問題
9、手寫代碼,有序數組查找某個元素出現的次數
10、手寫螺旋矩陣打印
11、象棋中馬走日從A點到B點的最短路徑走法
12、長爲N的數組,元素範圍是0-N-1,其中只有一個數是重複的,找出這個重複元素
13、矩陣從左上角向右下角走,每次只能向右或者向下移動,求經過最大的路徑
14、數n可以由完全平方數構成,求最小的完全平方數構成數。
15、(1)兩個棧實現一個隊列
(2)怎麼找出數組中出現兩次的數(有兩個數出現兩次,其他的都是一次)
(3)旋轉數組的最小值
(4)O(1)時間複雜度刪除單鏈表結點
(5)約瑟夫環問題推導
(6)O(1)實現取棧的最小
16、給定一個2叉樹,打印每一層最右邊的結點
17、給定一個數組,裏面只有一個數出現了一次,其他都出現了兩次。怎麼得到這個出現了一次的數?
18、在6基礎上,如果有兩個不同數的出現了一次,其他出現了兩次,怎麼得到這兩個數?
19、無重複數組找出第K大的數字 引出堆排序(是否穩定,時間/空間複雜度)
20、 給定n個數,尋找第k小的數,同時給出時間複雜度
21、比較常見的算法題,也要考慮到n的大小,說了排序,最大堆,以及partition算法,面試官還讓說,我說就知道這幾種
22、對10G個數進行排序,限制內存爲1G
大數問題,但是這10G個數可能是整數,字符串以及中文改如何排序,對中文排序沒有回答出來。
23、 鏈表刪去指定值的節點
23、 寫一個類似解析字符串的小程序(感覺考點是正則表達式)
24、求兩個int數組的並集、交集
25、11個漢諾塔問題,打印出轉移路徑,接着寫一個二叉樹前序遍歷的代碼,最後讓寫一個多叉樹實現,並層次遍歷的代碼