寫在開頭,腦袋鐵定秀逗了,歷時20多天,刷完了leetcode上面151道題目(當然很多是google的),感覺自己對算法和數據結構算是入門了,但仍然還有很多不清楚的地方,於是有了對於每道題目寫分析的沖動。不過在看到leetcode上面的文章之後,決定先從翻譯入手,順帶再寫寫自己做題的心得體會。今天是第一篇:程序員面試技巧。
如果你主修計算機科學,那麼在你工作的時候會碰到很多有難度的編程問題。當你去找工作的時候,你會有很多的面試,而面試官通常很喜歡問你很多技術性的問題,以下就是三類主要的題型:
後續我將詳細的討論上面這幾點:
你必須深刻的理解以下幾種數據結構:數組,鏈表,二叉樹,哈希表等。你必須明確地知道什麼時候該使用數組或者鏈表,譬如在實現一個列表翻轉的時候。
面試官通常會問你一些算法問題用以檢驗你的編程解決問題能力,一些算法問題如下:
(譯者吐槽,說句實話,上面幾個問題如果沒做題大部分我還真答不出來。)
如果你應聘的是C++職位,需要准備好應對很多C++的問題,其它編程語言也一樣。如果你應聘的職位不需要特定的編程語言,那麼你可能會被問到通用的計算機知識,譬如在堆和棧上面創建對象的區別。
我經常碰到的一些C++問題如下:
(譯者吐槽,上面這些感覺還算靠譜,至少沒問虛擬繼承是啥!我面試的時候通常還會問很多STL的東西,畢竟這在C++裡面已經是很基礎的了。Template這些的就算了,有時候都能把自己繞暈,還是別坑面試者了。)
一些面試官很喜歡用一個腦筋急轉彎來結束面試。這個其實很坑爹的,不過還是老老實實的准備一些吧。
一些經典的問題:
兩個雞蛋問題:
你有兩個相同的雞蛋,然後還有100層樓等你去爬。你需要知道最高到哪一層扔下雞蛋,雞蛋不會摔碎。(雞蛋語錄:為啥受傷的總是蛋蛋?)。很有可能第一層就碎了,也可能到了100層才碎。你需要知道最多嘗試幾次就能找到答案。
盡可能快的在一個byte裡面反轉bit。
你有5個相同的罐子,都裝著球,其中有4個裡面每個球都是重10g,另一個灌每個球重9g,你有一台電子稱,只稱一次,找到那個重9g球的罐子。
(譯者吐槽,上面這些腦筋急轉彎問題感覺就是算法問題,哪裡是腦筋急轉彎,明顯的忽悠!)
當然這是譯者自己的,原文在上面就結束了,可以看到,作為一個程序員,我們其實是幸運的,因為我們能夠接觸如此多的挑戰,並不斷提升自己。可我們同時也是郁悶的,很多時候往往都有這樣的錯覺,數據結構和算法在很多工作中並不用到,但是為啥偏偏就面這個,linus貌似說過:“Bad programmers worry about the code. Good programmers worry about data structures and their relationships”,而在《大教堂與集市》這本書裡面,作者直接說明“Smart data structures and dumb code works a lot better than the other way around”。有時候當寫程序寫多了,自然就發現算法和數據結構的重要性了。
另外,現在無論哪個公司,除非你是大牛級別的,面試幾乎不會脫離上面那些東西,所以還是老老實實的學習吧,騷年。