技術筆試的備考經驗

就説説對技術筆試的看法。多數公司考的很基礎,在參加筆試前,問問自己:你對線性表、二叉樹、堆、棧、散列這些基礎數據結構有多少了解?你能迅速的寫出常見的各種排序的一般實現麼?你對算法的時間和空間複雜性有概念麼?你對c的瞭解有多深?你看過《c專家編程》或者《c和指針》麼?你的c++經驗有多少?你至少完整的看過一遍《c++ primer》或《the c++ programming language》麼?你看過effective和exceptional系列麼?你對標準庫的理解是什麼?上面的這些問題如果你都可以做出肯定的答覆,那你已經基本可以應付技術筆試了。
也許有人問,有這麼多東西要看,我該怎麼準備?個人認為可以分四塊:語言、數據結構、算法和其他知識:
語言:我熟悉c/c++,就拿它説事。語言的基礎不難,不過是變量、函數、表達式、流控制等等。譚老師的教材和林鋭的書都是很好的入門材料。尤其是林鋭,着重突出容易犯錯的地方,象sizeof(char*)和sizeof(char[]),都是容易考到的,而且對一些高級話題,比如,vtable、vptr等都有涉及,可以讓人對c++裏讓人比較迷惑的東西有個直觀的認識。有人把他的書和《inside c++ object model》比,罵的一文不值,我覺得沒必要這樣,不是每個人都要成為lippman、stroustrup這樣的大師,科普讀物會讓更多的人對科學產生興趣。
對編程經驗在1w行以上的同學,語言基礎已經是小case。c高級編程系列,《c++ primer》,《the c++ programming language》,effective和exceptional系列是你應該熟悉的。比如adobe考試中的設計不可繼承的類這種技巧基礎課本里是不會提到的。你也應該熟悉標準庫,對常見的容器、迭代器、算法應該有所瞭解。我個人覺得《generic programming and stl》、《thinking in c++》2e的下冊和《effective stl》是很好的教材,當然邊看還要邊練練。
數據結構:對數據結構我沒什麼特別深入的研究。本科時候用清華嚴老師的教材,學的一塌糊塗,研究生自己把圖書館的數據結構書差不多都翻了一遍,感覺是大同小異。基礎的數據結構《algorithm in c++》裏講的很好,實現也很優雅。高級數據結構,象紅黑樹、b樹、二項堆、trie之類的《算法導論》裏有所涉及。
我認為應付一般的筆試/面試《algorithm in c++》已經足夠,如果想去百度之類對基礎知識要求比較高的公司,你就需要對avl,b樹,trie這些高級結構有比較深刻的瞭解。因為查找和排序是百度最看重的技能之一,就拿百度今年在北郵的海筆説,那道ip地址的題可以用區間樹或者基數排序解,而另一個查找子串的題目無非是kmp(我當時寫了一個樸素查找依然過關)。數據結構的複習強調多練習,難度以《數據結構》考研題目為準,這方面的書很多,我不多説。
算法:算法是我最沒信心的部分,找工作前狂補了幾個月也沒什麼成效。我個人的經驗是《算法導論》確實好,但它裏面過多的證明確實影響算法菜鳥學習的積極性,第一次閲讀時建議跳過。我更加推崇的書是《algorithm in c++》,knuth的學生寫的。裏面不但有很多的圖示也有精巧的實現,不管是數據結構還是基本算法的學習都是相當好的教材。主要看第一本,即《基礎、數據結構、排序與查找》。看完一個算法合上書,看看自己能不能寫出來。
看了書還要做題,我沒做過多少算法題目,直接導致被有道、emc鄙視,其實現在看來他們考的也都是很基礎的東西。我這裏推薦《算法設計與實驗題解》,裏面對遞歸、分治、dp、greedy這些經典常考的算法給出了很多題目和解答,幾乎包含了筆試可能考到的一切。比如有道高級編程題中的區間覆蓋問題,即是其中的原題,而另一道凸包問題是計算幾何的經典問題,只要涉及到計算幾何的書都有講。

技術筆試的備考經驗