藍鋒部落格: http://bluesfeng.javaeye.com
最近剛被Google電話面了一次. 感覺還不錯. 和面試官聊的很好. 到最後, 他竟然給我提了一些如何準備Google面試的經驗. 下面把自己的經驗和大家分享一下:
很多非技術的因素在這裡就不說了...
技術方面的準備包括:
1. 仔細鑽研一本資料結構和演算法的書.每個程式員都知道資料結構和演算法的重 要性, 可是為什麼呢?最主要的原因就在於經典的資料結構和演算法是對常見電腦問題的歸納和總結. 如果你精通資料結構和演算法, 當你遇到新問題時,你就 很容易將問題進行定位,比如說這是一個圖的問題還是樹的問題, 然後在運用系統的知識進行分析. 從而找到解決問題的方法. 例如:如果面試官問你最少可以用多少種顏色來填充中國地圖中的各個省的問題, 你就應該想到這是???
所以說,如果當你遇到一個問題時馬上能夠定位到該用什麼資料結構/演算法來解決, 著就是面試官首先想要看到的. 推薦一本書: Steven Skiena's The Algorithm Design Manual
1) 演算法複雜性分析. 你必須知道如何使用Big O來分析演算法的複雜性. 如果你不知道這個,你肯定過不了面試. 如果不知道, 仔細讀一下相關的那章. 你完全可以搞定的!
2) 排序演算法. 你需要知道排序演算法. 不要提冒泡排序法. 真正開發時沒人用. 你至少要知道一種n*log(n)的排序演算法. 比如: 快速排序法.
3) Hashtables. 你必須要知道如何使用雜湊表的使用. 你應該知道如何用你擅長的程式設計語言來實現一個雜湊表.
4) Trees: 你需要瞭解樹型結構, 二叉樹, BFS, DFS等遍曆演算法.
5) Maps: 圖非常非常非常非常非常重要. 就算你已經覺得圖已經很重要了. 但實際上, 它比你想的還要重要. 你應該瞭解圖在記憶體中的幾種標記法, 比如使用對象和指標, 使用距陣等. 同時你還需要瞭解圖的遍曆演算法, 以及它們的演算法複雜度, 還有如何在代碼中實現.
6) 其它的資料結構. 盡量學習書中的其它資料結構和演算法.
2. 數學. 有些Google的面試官很喜歡問一些離散數學方面的東西. 所以也需要做一些準備.
3. 作業系統. 你總要瞭解一些作業系統方面的基礎知識. 比如線程和進程,進程間的通訊等. 推薦一本書: Doug Lea's Concurrent Programming in Java
4. 編碼. 你應該精通一門程式設計語言, 比如C++, Java. C#也可以接受.
藍鋒部落格: http://bluesfeng.javaeye.com