起因
寫在開頭,腦袋鐵定秀逗了,歷時20多天,刷完了leetcode上面151道題目(當然非常多是google的),感覺自己對演算法和資料結構算是入門了,但仍然還有非常多不清楚的地方,於是有了對於每道題目寫分析的衝動。
只是在看到leetcode上面的文章之後,決定先從翻譯入手,順帶再寫寫自己做題的心得體會。
今天是第一篇:程式猿面試技巧。
假設你主修電腦科學。那麼在你工作的時候會碰到非常多有難度的程式設計問題。當你去找工作的時候,你會有非常多的面試。而面試官通常非常喜歡問你非常多技術性的問題,下面就是三類基本的題型:
- 演算法/資料結構
- 特定程式語言/通用的計算機知識
- 腦筋急轉彎
興許我將具體的討論上面這幾點:
演算法/資料結構
你必須深刻的理解下面幾種資料結構:陣列,連結串列。二叉樹,雜湊表等。
你必須明白地知道什麼時候該使用陣列或者連結串列,譬如在實現一個列表翻轉的時候。
面試官一般會問你一些演算法問題用以檢驗你的程式設計解決這個問題能力。一些演算法問題例如以下:
- 在一個句子裡面反轉單詞。
- 在一個單詞裡面反轉字母。
(嘗試使用迭代或者遞迴解決)
- 怎樣在一個列表裡面找到反覆的數字。
- 生成數字n的全排列。
(小提示:遞迴)
- 找到兩個排好序陣列的中間值。(小提示:分治法)
- 怎樣進行拼寫檢查並驗證單詞。
(小提示:編輯距離)
(譯者吐槽。說句實話,上面幾個問題假設沒做題大部分我還真答不出來。)
特定程式語言/通用的計算機知識
假設你應聘的是C++職位,須要準備好應對非常多C++的問題,其他程式語言也一樣。假設你應聘的職位不須要特定的程式語言,那麼你可能會被問到通用的計算機知識,譬如在堆和棧上面建立物件的差別。
我常常碰到的一些C++問題例如以下:
- 什麼是虛擬函式?怎麼實現的?使用虛擬函式會有啥效能問題?
- 什麼是虛解構函式?為什麼須要他們?假設你不實現成虛析構會出現什麼問題?
- 什麼是拷貝建構函式?它什麼時候被呼叫?
- malloc和new的差別是什麼?
(譯者吐槽,上面這些感覺還算靠譜,至少沒問虛擬繼承是啥!
我面試的時候通常還會問非常多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”。有時候當敲程式碼寫多了。自然就發現演算法和資料結構的重要性了。
另外。如今不管哪個公司。除非你是大牛級別的。面試差點兒不會脫離上面那些東西。所以還是老老實實的學習吧,騷年。