主要介紹算法面試的一些問題、以及如何準備算法面試java
算法面試不只僅是正確的回答問題
對於面試中遇到的大多數問題,都能有一個合理的思考路徑git
什麼是算法面試?
- 讓你們在面對面試中的算法問題時,有一個合理的思考路徑:
- 不表明可以「正確」回答每個算法問題,可是合理的思考方向其實更重要,也是正確完成算法面試問題的前提
- 算法面試優秀不意味着技術面試優秀
- 技術面試優秀不意味着可以拿到Offer
什麼是給出合理的思考路徑?
- 算法面試的目的不是給出一個「正確」答案,
- 而是展現給面試官你思考問題的方式。
「正確」自己是一個相對概念
- 算法面試不是高考。
- 把這個過程看做是和麪試官一塊兒探討一個問題的解決方案。
- 對於問題的細節和應用環境,能夠和麪試官溝通。
- 這種溝通自己很重要,它暗示着你思考問題的方式。
例子
咱們須要對一組數據進行排序github
- 設計排序接口,標準庫的設計,業務中排序算法。
- 排序是基礎操做,很重要。
解決面試
快速排序算法:O(nlogn)算法
(向面試官提問):這組數據有什麼樣的特徵?設計模式
- 有沒有可能包含有大量重複的元素?
- 若是有這種可能的話,三路快排是更好地選擇。
- 普通數據:普通快速排序就好了;java語言標準庫排序使用的三路快排。
- 是否大部分數據距離它正確的位置很近?是否近乎有序?
- 若是是這樣的話,插入排序是更好地選擇。
- 按照業務發生順序,先發生先完成,幾乎有序,插入排序是更好的選擇。
- 是否數據的取值範圍很是有限?好比對學生成績排序。
- 若是是這樣的話,計數排序是更好地選擇。高考成績取值範圍有限:計數排序更好。
(向面試官提問):對排序有什麼額外的要求?數組
(向面試官提問):數據的存儲情況是怎樣的?安全
- 是不是使用鏈表存儲的?
- 若是是的話,歸併排序是更好地選擇。
- 快排依賴於數組的隨機存取。
(向面試官提問):數據的存儲情況是怎樣的?微信
- 數據的大小是否能夠裝載在內存裏?
- 數據量很大,或者內存很小,不足以裝載在內存裏,須要使用外排序算法。
對一組數據進行排序小結
- 有沒有可能包含有大量重複的元素?
- 是否大部分數據距離它正確的位置很近?是否近乎有序?
- 是否數據的取值範圍很是有限?好比對學生成績排序。
- 是否須要穩定排序?
- 是不是使用鏈表存儲的?
- 數據的大小是否能夠裝載在內存裏?
什麼是「正確」的回答一個算法問題
- 正確除了你能把代碼編出來運行出正確的結果。正確還包含對問題的獨到看法;優化;代碼規範;容錯性;
- 不只僅是給出解決算法問題的代碼,還要把上面因素包括。
- 若是是很是難的問題,對你的競爭對手來講,也是難的。
- 關鍵在於你所表達出的解決問題的思路。
- 甚至經過表達解題思路的方向,得出結論:這個問題的解決方案,應該在哪個領域,我能夠經過查閱或者進一步學習解決問題。
算法面試只是面試的一部分
- 算法面試只是技術面試的一部分。
- 根據你的簡歷和應聘職位的不一樣,勢必要考察其餘技術方面。
- 項目經歷和項目中遇到的實際問題
面試前梳理本身簡歷上所寫到的項目:整理一下可能會問到的。markdown
- 你遇到的印象最深的bug是什麼?
- 面向對象
- 設計模式
- 網絡相關;安全相關;內存相關;併發相關;…
- 系統設計;scalability(大規模)
技術面試優秀不意味着可以拿到Offer
技術面試只是面試的一部分。面試不只僅是考察你的技術水平,仍是瞭解你的過去以及造成的思考行爲方式。
項目經歷:
如何找到項目?
- 實習
- 建立本身的項目
- 本身作小應用:計劃表;備忘錄;播放器…
- 本身解決小問題:爬蟲;數據分析;詞頻統計...
- 「不是項目」的項目:一本優秀的技術書籍的代碼整理等…(github)
- 分享:本身的技術博客;github等等
行爲類問題
經過過去了解你的思考行爲方式:
- 遇到的最大的挑戰?
- 犯過的錯誤?
- 遭遇的失敗?
- 最享受的工做內容?
- 遇到衝突的處理方式?
- 作的最不同凡響的事兒?
具體闡述:我在某某項目中遇到一個怎樣的算法問題:這個問題是怎樣的。它是我遇到的最大的挑戰,我是如何克服解決的。
準備好合適的問題問面試官
- 整個小組的大概運行模式是怎樣的?
- 整個項目的後續規劃是如何的?
- 這個產品中的某個問題是如何解決的?
- 爲何會選擇某些技術?標準?
- 我對某個技術很感興趣,在你的小組中我會有怎樣的機會深刻這種技術?
算法面試仍然是很是重要的一部分
如何準備算法面試
準備面試和準備算法面試 是兩個概念
- 算法面試,只是面試中的一個環節。
- 遠遠不須要啃完一本《算法導論》
- 強調理論證實
- 第一遍讀不須要弄懂證實
- 前幾遍閱讀應該記住結論就好了,不須要弄懂證實。把更多的精力放在算法思想上。
- 針對算法面試,算法導論裏面的理論推導和證實不是很重要的方面。
學習切記完美主義
- 基礎的概念要知道,可是不須要實現等更深刻的層面。
- 遠遠不須要到達信息學競賽的水平
算法面試的準備範圍
- 不要輕視基礎算法和數據結構,而只關注「有意思」的題目
- 各類排序算法
- 基礎數據結構和算法的實現:如堆、二叉樹、圖…
- 基礎數據結構的使用:如鏈表、棧、隊列、哈希表、圖、Trie、並查集…
- 基礎算法:深度優先、廣度優先、二分查找、遞歸…
- 基本算法思想:遞歸、分治、回溯搜索、貪心、動態規劃…
例子
Intel的面試題:
初始序列爲1 8 6 2 5 4 7 3的一組數採用堆排序,當建堆(小根堆)完畢時,堆所對應的二叉樹中序遍歷序列爲:( )
A. 8 3 2 5 1 6 4 7
B. 3 2 8 5 1 4 6 7
C. 3 8 2 5 1 6 7 4
D. 8 2 3 5 1 4 7 6
樂視的面試題:
對一個含有20個元素的有序數組作二分查找,數組起始下標爲1,則查找A[2]的比較序列的下標爲()
A. 九、五、四、2
B. 十、五、三、2
C. 九、六、2
D. 20、十、五、三、2
考查二分查找法。
阿里巴巴面試題
一組記錄排序碼爲(五、十一、七、二、三、17),則利用堆排序方法創建的初始堆爲()
A. (十一、五、七、二、三、17)
B. (十一、五、七、二、1七、3)
C. (1七、十一、七、二、三、5)
D. (1七、十一、七、五、三、2)
E. (1七、七、十一、三、五、2)
F. (1七、七、十一、三、二、5)
百度面試題
在圖採用鄰接表存儲時,求最小生成樹的Prim算法的時間複雜度爲( )
- O(n)
- O(n+e)
- O(n^2)
- O(n^3)
重點關注
- 基礎數據結構的使用:如鏈表、棧、隊列、哈希表、圖、Trie、並查集…
- 基礎算法:深度優先、廣度優先、二分查找、遞歸…
- 基本算法思想:遞歸、分治、回溯搜索、貪心、動態規劃…
選擇合適的OJ(Online judge):在線判題系統
- 不要選擇過於偏向程序設計競賽的OJ *面向競賽難度太高
-
選擇合適的oj
-
leetcode
-
HankeRank
注意
- 在學習和實踐作題之間,要掌握平衡
- 基礎算法實現與算法思想
如何回答算法面試問題
解決算法面試問題的總體思路
- 注意題目中的條件
- 有一些題目中的條件本質是暗示
- 設計一個O(nlogn)的算法(分治:在一顆搜索樹中完成任務,對於數據排序)
- 無需考慮額外的空間(用空間換時間上的優化)
- 數據規模大概是10000(O(n^2)就能夠)
當沒有思路的時候
- 本身給本身幾個簡單的測試用例,試驗一下
- 不要忽視暴力解法。暴力解法一般是思考的起點。
例子
LeetCode 3 Longest Substring Without Repeating Characters
在一個字符串中尋找沒有重複字母的最長子串
如」abcabcbb」,則結果爲」abc」
如」bbbbb」,則結果爲」b」
-
對於字符串s的子串s[i...j]
-
使用O(n^2)的算法遍歷i,j,能夠獲得全部的子串s[i...j]
-
使用O(length(s[i...j]))的算法判斷s[i...j]中是否含有重複字母
-
三重循環:複雜度O(n^3),對於n=100的數據,可行
優化算法
實際編寫問題
-
極端條件的判斷
- 數組爲空?
- 字符串爲空?
- 數量爲0?
- 指針爲NULL?
-
代碼規範:
-------------------------華麗的分割線--------------------
看完的朋友能夠點個喜歡/關注,您的支持是對我最大的鼓勵。
我的博客番茄技術小棧和掘金主頁
想了解更多,歡迎關注個人微信公衆號:番茄技術小棧