【玩轉算法】入門心得

  1. 算法功底決定Offer質量,因爲算法和數據結構最能體現一個人的基本功。基本功紮實的人,無論是做工程還是去做算法,都不會差到哪裏去。招人的時候都有一個標準:招進來的這個人至少要排到團隊裏面前 50%,不可能招一個很差的人來拉低平均水平。

  2. 技術棧本身每天都在變化,同時也會隨着不同行業不同公司變化。這就要求你學好以不變應萬變的算法思維、邏輯思維能力。

  3. 考察算法能力的原因有四:

    1. 算法能力能夠準確辨別一個程序員的技術功底是否紮實;
    2. 算法能力是發掘程序員的學習能力與成長潛力的關鍵手段;
    3. 算法能力能夠協助判斷程序員在面對新問題時,分析並解決問題的能力;
    4. 算法能力是設計一個高性能系統的必備基礎。
  4. 面對面試中的算法問題時,最重要的是有一個合理的思考路徑,而這不代表能夠“正確”回答每一個算法問題。合理的思考方向其實更重要,也是正確完成算法面試問題的前提,算法面試優秀不意味着技術面試優秀,技術面試優秀不意味着能夠拿到Offer。

  5. 算法面試的目的不是給出一個“正確”的答案,而是展示給面試官你思考問題的方式。“正確”本身是一個相對概念,算法面試不是高考。把這個過程看作是和麪試官一起探討一個問題的解決方案。對於問題的細節和應用環境,可以和麪試官溝通。這種溝通本身很重要,它暗示着你思考問題的方式。不能立刻寫代碼而不去交流,從而發揮失常,不能良好應對,浪費了時間,錯失機會

  6. 面試官看重你的解題思路,以及能將思路迅速地變成代碼的能力。希望你在分析問題的時候能準確地把握住考點,提出各種問題和麪試官探討,並給出各種解決問題的方案,剖析它們的利弊。

  7. 舉一個例子,給一組數據排序,答案不只考慮正確,而更應考慮最優。此時要和麪試官溝通,這組數據有什麼樣的特徵?

    1. 有沒有可能包含有大量重複的元素?
      1. 如果有這種可能的話,三路快排是更好地選擇。Java內置的排序算法就是基於三路快排。
    2. 是否大部分數據距離它正確的位置很近?是否近乎有序?
      1. 如果是這樣的話,插入排序是更好地選擇。
    3. 是否數據的取值範圍非常有限?比如對學生成績排序。
      1. 如果是這樣的話,計數排序是更好地選擇。
    4. 是否需要穩定排序?
      1. 如果是的話,歸併排序是更好地選擇。
    5. 數據的存儲狀況是怎樣的?是否是使用鏈表存儲的?
      1. 如果是的話,歸併排序是更好地選擇。
    6. 數據的存儲狀況是怎樣的?數據的大小是否可以裝載在內存裏?
      1. 數據量很大,或者內存很小,不足以裝載在內存裏,需要使用外部排序算法。
  8. 正確還包含對問題的獨到見解優化代碼規範容錯性等等。

  9. 什麼是“正確”的回答一個算法問題?

    1. 如果是非常難的問題,對你的競爭對手來說,也是難的。
    2. 關鍵在於你所表達出的解決問題的思路。甚至通過表達解題思路的方向,得出結論:這個問題的解決方案,應該在哪一個領域,我可以通過查閱或者進一步學習解決問題。
  10. 算法面試優秀不意味着技術面試優秀,算法面試只是技術面試的一部分。根據你的簡歷和應聘職位的不同,勢必要考察其他技術方面,比如下述問題:

    1. 項目經歷和項目中遇到的實際問題
    2. 你遇到的印象最深的bug是什麼?
    3. 面向對象
    4. 設計模式
    5. 網絡相關;安全相關;內存相關;併發相關;
    6. 系統設計; scalability
  11. 技術面試優秀並不意味着能拿到offer,技術面試只是面試的一部分。面試不僅僅是考察你的技術水平,還是瞭解你的過去以及形成的思考行爲方式。因此,你參與的項目至關重要。

  12. 創建自己的項目:

    1. 自己做小應用:計劃表、備忘錄、播放器…
    2. 自己解決小問題:爬蟲、數據分析、詞頻統計…
    3. “不是項目“的項目:一本優秀技術書籍的代碼整理。
    4. 分享:自己的技術博客、github等等
  13. 通過過去了解你的思考行爲方式:

    1. 遇到的最大的挑戰?
    2. 犯過的錯誤?
    3. 遭遇的失敗?
    4. 最享受的工作內容?
    5. 遇到衝突的處理方式?
    6. 做的最與衆不同的事兒?
  14. 準備好合適的問題問面試官,比如:

    1. 整個小組的大概運行模式是怎樣的?
    2. 整個項目的後續規劃是如何的?
    3. 這個產品中的某個問題是如何解決的?
    4. 爲什麼會選擇某些技術?標準?
    5. 我對某個技術很感興趣,在你的小組中我會有怎樣的機會深入這種技術?
  15. 不要輕視基礎算法和數據結構,而只關注“有意思”的題目,算法面試的準備範圍如下:

    1. 各種排序算法
    2. 基礎數據結構和算法的實現:如堆、二叉樹、圖…
    3. 基礎數據結構的使用:如鏈表、棧、隊列、哈希表、圖、Trie、 並查集…
    4. 基礎算法:深度優先、廣度優先、二分查找、遞歸…
    5. 基本算法思想:遞歸、分治、回溯搜索、貪心、動態規劃…
  16. 要在學習和算法實踐之間掌握平衡,掌握平衡要注重能力的提升,而不是刷題數字。不會有公司因爲刷題多而錄用你。

  17. 做題時要注意題目中的條件,有一些題目中的條件本質是暗示,如:

    1. 給定一個有序數組:有序
    2. 設計一個O(nlogn)的算法:分治法,搜索數
    3. 無需考慮額外的空間:使用外部
    4. 數據規模大概是10000:複雜度可以更高
  18. 當沒有思路的時候怎麼辦?

    1. 自己給自己幾個簡單的測試用例,試驗一下。
    2. 不要忽視暴力解法。暴力解法通常是思考的起點。
  19. 優化算法的步驟:

    1. 遍歷常見的算法思路
    2. 遍歷常見的數據結構
    3. 空間和時間的交換(哈希表)
    4. 預處理信息(排序)
    5. 在瓶頸處尋找答案: O(nlogn) + O(n^2) ; O(n^3)
  20. 實際編寫問題要注意以下幾點:

    1. 極端條件的判斷:數組爲空?字符串爲空?數量爲0?指針爲NULL?
    2. 變量名語義化
    3. 模塊化,複用性
  21. 對最基本的問題能達到白板編程的程度。

  22. 如何刷LeetCode:

    1. HOT100開始刷,建議主要做自己要費點力氣才能做得出來(但又不是完全做不出)的題。
    2. 直接在LeetCode網站提交代碼的窗口裏做題,肉眼debug,不用IDE。
    3. AC之後,要去看Discussion/Solution, 看別人更好的解法/寫法。
    4. 建議至少刷200-300道,強者找實習之前刷了400道, 秋招之前刷了700多道。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章