如果你只想獲取一些面試準備經驗,那麼你可以直接跳到文章的最後部分。
對於演算法面試問題是否有效一直飽受爭議。然而,程式碼編寫問題有時候能夠很好篩選人才。在我們的例子中:
- 這些問題是“CS101”水平的;
- 我們相信一個優秀的開發者需要能夠做出好的決定,並且這種好的決定是基於對有多少個複雜系統在互動的深刻理解上。如果一個開發者不能反轉一個字串,那麼他們又怎麼可能理解大型客戶端面臨軟體的效能含義?
誠然,參與我們CS02課程的中學生都很聰明(其中一個還是美國計算機奧林匹克對隊員)。然而,在對大型軟體公司(如微軟、亞馬遜、谷歌等)的多年採訪後,我們發現專業的開發者們並沒有比我們的職業顧問人員牛多少。
問題如下:
1. 求從10到100中能被3或5整除的數的和
1 2 3 4 5 6 7 |
int sum = 0; for(int i = 10; i <= 100; i++) if( i % 3 == 0 || i % 5 == 0) sum += i; System.out.println(sum); |
2. 將一個字串逆序,不要使用反轉函式
1 2 3 4 5 6 7 |
String message = "he saw a racecar"; StringBuilder rev = new StringBuilder(); for (int i = message.length()-1; i >= 0; i--) rev.append(message.charAt(i)); System.out.println(rev.toString()); |
3. 反轉一個棧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.*; public class MyProgram extends com.ktbyte.submit.Coder { public static void main(String[] args) { Stack items = new Stack(); items.push("he"); //he is at the bottom of the stack items.push("saw"); items.push("a"); items.push("racecar"); reverseStack(items); //now he is at the top //print in order pushed: while(items.size()>0) System.out.println(items.pop()); } public static void reverseStack(Stack stack) { Queue rev = new LinkedList(); while(stack.size()>0) rev.offer(stack.pop()); while(rev.size()>0) stack.push(rev.poll()); } } |
問題解決的步驟和錯誤:
1. 解析問題,手工“解決”
- 對於孩子和成年人而言,這一步對前者來說更困難
- 然而,如果要求誤解了問題的學生來重讀這個問題,孩子們的表現會超過成年人
2. 想出一個虛擬碼演算法
- 在這一步,學生的表現比成年人要好。
- 讓人震驚的是,很多成年人不知道如何用他們偏好的程式語言從一個字串中抽取一個字元。
3. 將演算法轉換為程式碼
- 我們有一些C++程式設計師,他們不知道方括號以及一些C程式設計師,他們採用指標運算,但是卻失敗了。
- 更讓人吃驚的是,當他們允許查閱java API 文件 或者使用參考書,很多成年人無法找到合適的文件來幫助解決問題。
- 的確,一些中學生已經忘了如何使用棧或者例項化一個佇列,但是,所有人都能夠在適當的時間內通過查閱找到解決辦法。
- 會寫程式碼的成年人(曾經會)經常會超過時間限制。
有很多糟糕的程式碼編寫者,即便你也是其中一個,也別不要害怕
下面的方法並不是為了讓求職者參加一個“完整的堆疊訓練營”。相反,如果你是一個正在努力和“程式設計謎題”做鬥爭的成年人:
1. 不停練習,直到你能快速且正確地寫出小的程式碼片段。沒有任何理由用自己喜歡的語言寫不出一個雙迴圈。找一些帶有例子的小的程式碼智力題,你能在一分鐘以內理解這些問題。對這類問題做成百上千遍的練習(不僅僅是幾十遍,切記!)。
2. 為課本上的每個演算法寫一個用例列表。一個共同的錯誤就是僅僅記住計算複雜度表。但是看一些演算法的使用例子,例如 A*搜尋在哪些地方使用,這比學習程式碼本身要有用的多。
3. 至少做一個能逼迫你使用與工作相關的介面/用例的大型專案。語言通常不是很重要,而且獨自寫一個大型工程能夠強迫你去學新的設計模式以及遠離遺留程式碼維護。程式碼面試是智利測試。所以它們很少關注具體的體系。
4. 讓自己接觸更優秀的程式設計師。隨著 CS 崗位的快速增長,應對“檸檬市場”的當前解決辦法就是技術面試。但是同樣也有其他的方式來反映被面試者的資訊。例如,對熱點話題、部落格、技術的知識可以反映出對重要問題的意識。類似地,對恐怖故事採用幽默的程式碼書寫方式,可以反映出經驗和處理新問題的能力。幸運的是,線上程式碼編寫社群隨處可見,所以唯一地障礙就是是否肯花時間和保持謙虛。
編注:市場上產品質量等級不同,質量的差異與不確定存在於很多市場,而買賣雙方的資訊不對稱,產品的賣方對產品的質量擁有比買方更多的資訊,這種資訊不對稱情況下的市場可能導致某市場萎縮甚至消失,也就是所謂的檸檬市場。