-
算法功底決定Offer質量,因爲算法和數據結構最能體現一個人的基本功。基本功紮實的人,無論是做工程還是去做算法,都不會差到哪裏去。招人的時候都有一個標準:招進來的這個人至少要排到團隊裏面前 50%,不可能招一個很差的人來拉低平均水平。
-
技術棧本身每天都在變化,同時也會隨着不同行業不同公司變化。這就要求你學好以不變應萬變的算法思維、邏輯思維能力。
-
考察算法能力的原因有四:
- 算法能力能夠準確辨別一個程序員的技術功底是否紮實;
- 算法能力是發掘程序員的學習能力與成長潛力的關鍵手段;
- 算法能力能夠協助判斷程序員在面對新問題時,分析並解決問題的能力;
- 算法能力是設計一個高性能系統的必備基礎。
-
面對面試中的算法問題時,最重要的是有一個合理的思考路徑,而這不代表能夠“正確”回答每一個算法問題。合理的思考方向其實更重要,也是正確完成算法面試問題的前提,算法面試優秀不意味着技術面試優秀,技術面試優秀不意味着能夠拿到Offer。
-
算法面試的目的不是給出一個“正確”的答案,而是展示給面試官你思考問題的方式。“正確”本身是一個相對概念,算法面試不是高考。把這個過程看作是和麪試官一起探討一個問題的解決方案。對於問題的細節和應用環境,可以和麪試官溝通。這種溝通本身很重要,它暗示着你思考問題的方式。不能立刻寫代碼而不去交流,從而發揮失常,不能良好應對,浪費了時間,錯失機會
-
面試官看重你的解題思路,以及能將思路迅速地變成代碼的能力。希望你在分析問題的時候能準確地把握住考點,提出各種問題和麪試官探討,並給出各種解決問題的方案,剖析它們的利弊。
-
舉一個例子,給一組數據排序,答案不只考慮正確,而更應考慮最優。此時要和麪試官溝通,這組數據有什麼樣的特徵?
- 有沒有可能包含有大量重複的元素?
- 如果有這種可能的話,三路快排是更好地選擇。Java內置的排序算法就是基於三路快排。
- 是否大部分數據距離它正確的位置很近?是否近乎有序?
- 如果是這樣的話,插入排序是更好地選擇。
- 是否數據的取值範圍非常有限?比如對學生成績排序。
- 如果是這樣的話,計數排序是更好地選擇。
- 是否需要穩定排序?
- 如果是的話,歸併排序是更好地選擇。
- 數據的存儲狀況是怎樣的?是否是使用鏈表存儲的?
- 如果是的話,歸併排序是更好地選擇。
- 數據的存儲狀況是怎樣的?數據的大小是否可以裝載在內存裏?
- 數據量很大,或者內存很小,不足以裝載在內存裏,需要使用外部排序算法。
- 有沒有可能包含有大量重複的元素?
-
正確還包含對問題的獨到見解、優化、代碼規範、容錯性等等。
-
什麼是“正確”的回答一個算法問題?
- 如果是非常難的問題,對你的競爭對手來說,也是難的。
- 關鍵在於你所表達出的解決問題的思路。甚至通過表達解題思路的方向,得出結論:這個問題的解決方案,應該在哪一個領域,我可以通過查閱或者進一步學習解決問題。
-
算法面試優秀不意味着技術面試優秀,算法面試只是技術面試的一部分。根據你的簡歷和應聘職位的不同,勢必要考察其他技術方面,比如下述問題:
- 項目經歷和項目中遇到的實際問題
- 你遇到的印象最深的bug是什麼?
- 面向對象
- 設計模式
- 網絡相關;安全相關;內存相關;併發相關;
- 系統設計; scalability
-
技術面試優秀並不意味着能拿到offer,技術面試只是面試的一部分。面試不僅僅是考察你的技術水平,還是瞭解你的過去以及形成的思考行爲方式。因此,你參與的項目至關重要。
-
創建自己的項目:
- 自己做小應用:計劃表、備忘錄、播放器…
- 自己解決小問題:爬蟲、數據分析、詞頻統計…
- “不是項目“的項目:一本優秀技術書籍的代碼整理。
- 分享:自己的技術博客、github等等
-
通過過去了解你的思考行爲方式:
- 遇到的最大的挑戰?
- 犯過的錯誤?
- 遭遇的失敗?
- 最享受的工作內容?
- 遇到衝突的處理方式?
- 做的最與衆不同的事兒?
-
準備好合適的問題問面試官,比如:
- 整個小組的大概運行模式是怎樣的?
- 整個項目的後續規劃是如何的?
- 這個產品中的某個問題是如何解決的?
- 爲什麼會選擇某些技術?標準?
- 我對某個技術很感興趣,在你的小組中我會有怎樣的機會深入這種技術?
-
不要輕視基礎算法和數據結構,而只關注“有意思”的題目,算法面試的準備範圍如下:
- 各種排序算法
- 基礎數據結構和算法的實現:如堆、二叉樹、圖…
- 基礎數據結構的使用:如鏈表、棧、隊列、哈希表、圖、Trie、 並查集…
- 基礎算法:深度優先、廣度優先、二分查找、遞歸…
- 基本算法思想:遞歸、分治、回溯搜索、貪心、動態規劃…
-
要在學習和算法實踐之間掌握平衡,掌握平衡要注重能力的提升,而不是刷題數字。不會有公司因爲刷題多而錄用你。
-
做題時要注意題目中的條件,有一些題目中的條件本質是暗示,如:
- 給定一個有序數組:有序
- 設計一個O(nlogn)的算法:分治法,搜索數
- 無需考慮額外的空間:使用外部
- 數據規模大概是10000:複雜度可以更高
-
當沒有思路的時候怎麼辦?
- 自己給自己幾個簡單的測試用例,試驗一下。
- 不要忽視暴力解法。暴力解法通常是思考的起點。
-
優化算法的步驟:
- 遍歷常見的算法思路
- 遍歷常見的數據結構
- 空間和時間的交換(哈希表)
- 預處理信息(排序)
- 在瓶頸處尋找答案: O(nlogn) + O(n^2) ; O(n^3)
-
實際編寫問題要注意以下幾點:
- 極端條件的判斷:數組爲空?字符串爲空?數量爲0?指針爲NULL?
- 變量名語義化
- 模塊化,複用性
-
對最基本的問題能達到白板編程的程度。
-
如何刷LeetCode:
- 從HOT100開始刷,建議主要做自己要費點力氣才能做得出來(但又不是完全做不出)的題。
- 直接在LeetCode網站提交代碼的窗口裏做題,肉眼debug,不用IDE。
- AC之後,要去看Discussion/Solution, 看別人更好的解法/寫法。
- 建議至少刷200-300道,強者找實習之前刷了400道, 秋招之前刷了700多道。
【玩轉算法】入門心得
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.