阿里供應鏈面試

寫在前面

阿里供應鏈JAVA開發,電話面1.5h。

  • 整體面試問的都比較基礎
  • 筆者的方向是人工智能,面試官推薦投算法崗,由於筆者對JAVA不太熟悉,於是面試官說拋開語言(沒有涉及到C++相關知識),重點聊的是算法
  • 在這過程中,完全根據我的簡歷在提問,涉及到:數據結構、計算機網絡、操作系統、數據庫及項目,項目問的比較深入

面試流程

  1. 自我介紹
  2. 基礎知識
  3. 項目

基礎知識

數據結構內容
1. 常用的排序算法
問到了時間複雜度、空間複雜度?什麼是空間複雜度?
穩定的排序算法、不穩定的排序算法(快些選一堆)?什麼是穩定、什麼是不穩定?
實例:10億個數,找到其中最小的100個數,給個方案,說出其中的時間複雜度、空間複雜度

答案一:基於快排來實現,如果找到了排在位置100的元素,就找到了最小的100個數,該元素左面的元素就是最終結果;如果找到的位置在但是每次都需要比較10億個數。
面試官對此提出疑問,問有沒有其他方案;
答案二:基於堆排實現,逐漸調入內存,不需要一次性調入所有的數,時間複雜度O(nklogk)n是10億,k是100
答案二優化:可以把所有10億個數據分組存放,比如分別放在1000個文件中。這樣處理就可以分別在每個文件的10^6個數據中找出最大的100個數,合併到一起在再找出最終的結果。

2.數據結構:對比鏈表和數組的優缺點
實例:鏈表中是否有環

答案一:遍歷鏈表,遍歷的同時進行標記,訪問到一個標記過的節點說明有環,否則沒有。時間複雜度O(N),空間複雜度O(N)
面試官深入詢問:能否給出時間複雜度O(N),空間複雜度O(1)的算法?
答案二:雙指針法,兩個指針:快慢指針,快指針一次走兩個節點,慢指針一次走一個節點,快慢指針相遇說明有環,不相遇說明沒有環
深入提問:能否用數學思想來證明雙指針法
答:用兩個人在操場上跑步,來證明。快(速度):2v;慢(速度):v, 操場一圈:s. 經過時間t後 2vt - vt = ks,快指針比慢指針多跑了k圈,k = vt / s一定有解。相遇的時候慢指針跑的不夠一圈,快指針跑的是k圈加上慢指針跑的路程

3.跳錶

4.二叉樹
什麼是完全二叉樹?
對二叉排序樹,如何遍歷得到一個升序的排序結果?
什麼是深度優先遍歷?什麼是廣度優先遍歷?

5.哈希表
哈希表的功能、應用場景?就是說創建哈希結構的目的是什麼?
哈希表如何實現高效查找的?
哈希算法有哪些?

直接尋址、隨機數法、除留餘數法、平方取中法、摺疊法、數字分析法

存儲數據時發生哈希衝突,有哪些處理衝突的方法?

直接地址法、再散列法、鏈地址法、建立公共溢出區

6.布隆過濾器
參考鏈接
參考鏈接

計算機網絡內容

7.tcp/ip協議
tcp協議傳輸過程中會有拆包和粘包現象,什麼時候會發生拆包和粘包?這種現象發生的原因?
操作系統內容
8.進程、線程和協程
用戶態
協程和線程有什麼關係?
多個協程對應的線程ID都是相同的
9.多路複用epoll/select

數據庫
對mysql數據庫瞭解多少?
10.數據庫的事務
什麼是事務?
事務的四大特徵及簡單解釋?
mysql怎麼保證事務的持久性的?
事務的隔離級別?
mysql默認情況下是哪種隔離級別?
描述下這四種隔離級別的場景?

機器學習
常用的機器學習的算法?
什麼情況下會使用神經網絡算法?
如何驗證分類的正確性?
什麼情況下會使用決策樹?
實際項目中用到的是什麼算法?

項目

該項目的使用場景?
兩個班級的同學同時預約了這個機房,如何來處理這種情況?
數據庫是怎麼設計的?
兩個線程是隔離的狀態,如何來處理上述的衝突的情況?
加鎖
鎖的力度有多大?
行鎖
用什麼方式來實現鎖?鎖是加在程序裏還是加在數據庫裏面?
加在數據庫上,設置一個延時機制,定義一個全局變量,用時間來控制對當前數據庫的操作
時間如何控制數據庫呢?
在當前時間範圍內,只有一個用戶可以對數據庫進行操作
兩個線程可能會同時對這個變量做操作?
給變量加鎖
加讀鎖還是加寫鎖?
加寫鎖
只有一個線程可以寫成功,線程往裏面寫什麼呢?
對數據進行遞減操作
操作完後,再釋放這把鎖

總結

數據庫、併發瞭解的深度不夠

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章