# 程序員如何準備面試中的算法 #
## 備戰面試中算法的五個步驟 ##
對于立志進一線互聯網公司,同時不滿足于一輩子干純業務應用開發,希望在后端做點事情的同學來說,備戰面試中的算法,分為哪幾個步驟呢?如下:
### 1、掌握一門編程語言 ###
首先你得確保你已掌握好一門編程語言:
- C的話,推薦Dennis M. Ritchie & Brian W. Kernighan合著的《C程序設計語言》,和《C和指針》;
- C++ 則推薦《C++ Primer》,《深度探索C++對象模型》,《Effective C++》;
- Java推薦《Thinking in Java》,《Core Java》,《Effictive Java》,《深入理解Java虛擬機》。
掌握一門語言并不容易,不是翻完一兩本書即可了事,語言的細枝末節需要在平日不斷的編程練習中加以熟練。
### 2、過一遍微軟面試100題系列 ###
我從2010年起開始整理[微軟面試100題系列](http://blog.csdn.net/column/details/ms100.html),見過的題目不可謂不多,但不管題目怎般變化,依然是那些常見的題型和考察點,當然,不考察任何知識點,純粹考察編程能力的題目也屢見不鮮。故不管面試題千變萬化,始終不離兩點:①看你基本知識點的掌握情況;②編程基本功。
而當你看了一遍微軟面試100題之后(不要求做完),你自會意識到:數據結構和算法在筆試面試中的重要性。
### 3、苦補數據結構基礎 ###
如果學數據結構,可以看我們在大學里學的任一本數據結構教材都行,如果你覺得實在不夠上檔次,那么可以再看看《STL源碼剖析》。
然后,你會發現:大部分的面試題都在圍繞一個點:基于各種數據結構上的增刪改查。如字符串的查找翻轉,鏈表的查找遍歷合并刪除,樹和圖的查找遍歷,后來為了更好的查找,我們想到了排序,排序仍然不夠,我們有了貪心、動態規劃,再后來東西多了,于是有了海量數據處理,資源有限導致人們彼此競爭,出現了博弈組合概率。
### 4、看算法導論 ###
《算法導論》上的前大部分的章節都在闡述一些經典常用的數據結構和典型算法(如[二分查找](https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/04.01.md),[快速排序](http://blog.csdn.net/v_july_v/article/details/6116297)、[Hash表](http://blog.csdn.net/v_JULY_v/article/details/6256463)),以及一些高級數據結構(諸如[紅黑樹](https://github.com/Xuanwo/The-Art-Of-Programming-By-July/blob/master/ebook/zh/07.1.md)、[B樹](http://blog.csdn.net/v_JULY_v/article/details/6530142)),如果你已經學完了一本數據結構教材,那么建議你著重看貪心、動態規劃、圖論等內容,這3個議題每一個議題都大有題目可出。同時,熟悉[常用算法的時間復雜度](http://bigocheatsheet.com/)。
如果算法導論看不懂,你可以參看本博客。
### 5、刷leetcode或cc150或編程藝術系列 ###
- 如主要在國外找工作,推薦兩個面試編程網站:一個是http://leetcode.com/ ,leetcode是國外一網站,它上面有不少編程題;另外一個是http://www.careercup.com/ ,而后這個網站的創始人寫了本書,叫《careercup cracking coding interview》,最終這本英文書被圖靈教育翻譯出版為《程序員面試金典》。
- 若如果是國內找工作,則鄭重推薦我編寫的《程序員編程藝術》,有[編程藝術博客版](http://blog.csdn.net/v_JULY_v/article/details/6460494),以及在博客版本基礎上精簡優化的[編程藝術github版](https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/Readme.md)。除此之外,還可看看《編程之美》,與《劍指offer》。
而不論是準備國內還是國外的海量數據處理面試題,此文必看:[教你如何迅速秒殺掉:99%的海量數據處理面試題](http://blog.csdn.net/v_july_v/article/details/7382693)。
此外,多看看優秀的開源代碼,如[nginx](https://github.com/nginx/nginx)或[redis](http://redis.io/),多做幾個項目加以實踐之,盡早實習(在一線互聯網公司實習3個月可能勝過你自個黑燈瞎火摸爬滾打一年)。
當然,如果你是準備社招,且已經具備了上文所說的語言 & 數據結構 & 算法基礎,可以直接跳到本第五步驟,開始刷leetcode或cc150或編程藝術系列。
## 后記 ##
學習最忌心浮氣躁,急功近利,即便練習了算法,也不一定代表能萬無一失通過筆試面試關,因為總體說來,在一般的筆試面試中,70%**基礎**+ 30%**coding能力**(含算法),故如果做到了上文中的5個步驟,還遠遠不夠,最后,我推薦一份非算法的書單,以此為大家查漏補缺(不必全部看完,歡迎大家補充):
1. 《深入理解計算機系統》
2. W.Richard Stevens著的《TCP/IP詳解三卷》,《UNIX網絡編程二卷》,《UNIX環境高級編程:第2版》,詳見此[豆瓣頁面](http://book.douban.com/search/W.Richard%20Stevens);
3. 你如果要面機器學習一類的崗位,建議看看相關的算法(如[支持向量機通俗導論(理解SVM的三層境界)](http://blog.csdn.net/v_july_v/article/details/7624837)),及老老實實補補數學基礎,包括微積分、線性代數、概率論與數理統計*(除了教材,推薦一本《數理統計學簡史》)*、矩陣論*(推薦《矩陣分析與應用》)*等..
最后望大家循序漸進,踏實前進,若實在覺得算法 & 編程太難,轉產品、運營、測試、運維、前端、設計都是不錯的選擇,因為雖然編程有趣,但不一定人人適合編程。
- 程序員如何準備面試中的算法
- 第一部分 數據結構
- 第一章 字符串
- 1.0 本章導讀
- 1.1 旋轉字符串
- 1.2 字符串包含
- 1.3 字符串轉換成整數
- 1.4 回文判斷
- 1.5 最長回文子串
- 1.6 字符串的全排列
- 1.10 本章習題
- 第二章 數組
- 2.0 本章導讀
- 2.1 尋找最小的 k 個數
- 2.2 尋找和為定值的兩個數
- 2.3 尋找和為定值的多個數
- 2.4 最大連續子數組和
- 2.5 跳臺階
- 2.6 奇偶排序
- 2.7 荷蘭國旗
- 2.8 矩陣相乘
- 2.9 完美洗牌
- 2.15 本章習題
- 第三章 樹
- 3.0 本章導讀
- 3.1 紅黑樹
- 3.2 B樹
- 3.3 最近公共祖先LCA
- 3.10 本章習題
- 第二部分 算法心得
- 第四章 查找匹配
- 4.1 有序數組的查找
- 4.2 行列遞增矩陣的查找
- 4.3 出現次數超過一半的數字
- 第五章 動態規劃
- 5.0 本章導讀
- 5.1 最大連續乘積子串
- 5.2 字符串編輯距離
- 5.3 格子取數
- 5.4 交替字符串
- 5.10 本章習題
- 第三部分 綜合演練
- 第六章 海量數據處理
- 6.0 本章導讀
- 6.1 關聯式容器
- 6.2 分而治之
- 6.3 simhash算法
- 6.4 外排序
- 6.5 MapReduce
- 6.6 多層劃分
- 6.7 Bitmap
- 6.8 Bloom filter
- 6.9 Trie樹
- 6.10 數據庫
- 6.11 倒排索引
- 6.15 本章習題
- 第七章 機器學習
- 7.1 K 近鄰算法
- 7.2 支持向量機
- 附錄 更多題型
- 附錄A 語言基礎
- 附錄B 概率統計
- 附錄C 智力邏輯
- 附錄D 系統設計
- 附錄E 操作系統
- 附錄F 網絡協議
- sift算法
- sift算法的編譯與實現
- 教你一步一步用c語言實現sift算法、上
- 教你一步一步用c語言實現sift算法、下
- 其它
- 40億個數中快速查找
- hash表算法
- 一致性哈希算法
- 倒排索引關鍵詞不重復Hash編碼
- 傅里葉變換算法、上
- 傅里葉變換算法、下
- 后綴樹
- 基于給定的文檔生成倒排索引的編碼與實踐
- 搜索關鍵詞智能提示suggestion
- 最小操作數
- 最短摘要的生成
- 最長公共子序列
- 木塊砌墻原稿
- 附近地點搜索
- 隨機取出其中之一元素