只要是在 CS 產業,想要當軟體工程師,基本的資料結構和演算法功力是必須要時時打磨的,這次就整理一些好用的工具,而且盡量把資源最小化,讓大家在準備面試時有足夠資源,又不會被太多資料弄得暈頭轉向。
如果是剛開始刷題,可以透過寫 Hackerrank 的題目幫忙複習基本的資料結構和演算法。
Lintcode 有一些 ladder 也還不錯,可以幫助循序漸進地刷題。比如說下圖的 bit manipulation ladder:
Leetcode 應該就不用多說,很多人應該都知道,只要你有了一定基礎,需要大量練習題目,那 Leetcode 絕對是不二選擇。
而且 Leetcode 也可以按照不同的 topic,區分難易度,甚至可以花錢看到各公司常出的題目,也是很不錯。
九章算法是中國有名的演算法教學網站,他們現在也推出了許多課程,如果是喜歡有人幫忙把資料整理好、並包含講解的,也可以先來上這個課,再好好刷題。
基本上要寫出一道題目,而且要做到 bug free,必須要有下列能力:
- 釐清問題(展現細心程度,可以跟面試官溝通清楚問題範圍再下手)
- 想出演算法(展現資料結構和演算法的應用能力)
- 寫出 pseudo code(展現把初步想法變成可運行程式的能力)
- 寫出 code(展現程式語言的掌握能力)
- 人體 debug(展現 unit test、integration test 的基本能力)
- 溝通能力(問清楚問題、把自己的想法講清楚、在必要時尋求協助)
如果把所有能力都混在一起練習,就很容易混亂,因為每一道題目讓你卡的點可能都不同;反之,如果有意識地發現自己容易卡在什麼地方,就容易專項加強(例如你常常可以想出演算法並實作,但常常掛在 edge case,那你應該先加強 1,讓自己考慮的 test case 更完善,再開始想演算法;然後也要加強 5,讓你在測試自己程式時,可以更完整)。
這一點 非常非常非常 重要!如果能夠把想過的解法清楚地寫下來,之後想要複習就會事半功倍,畢竟有很多很 tricky 的題目,如果每次都要重想,會花非常多時間。 此外,如果想要準備得更充足,寫完問題想一想 follow-up question 會怎麼出也是很重要的,如果沒有文件累積,每次看到題目連以前想懂的東西都要重來,那又怎麼有時間準備更進階的問題呢? 紀錄的工具很多種,像是寫個 blog、gitbook 或是 github repository 都是不錯的選擇。可以參考 這個 gitbook - leetcode note。
說真的,網路上的面試準備資源超級多,整理得很用心的 github repository 也很多,但是,重點還是在於能否把題目寫出來。所以與其收集一堆資源但不會寫,不如就專注在 leetcode 好好寫題目。
以上幫大家整理了一些好用的面試準備資源,如果你想要上手,可以從 hackerrank 跟 lintcode 開始找回資料結構和演算法的基本手感。要練習各種變形題目的話,就上 leetcode 狂刷題。如果看到某個知識想要更加了解,google 看看或是參考 awesome-competitive-programming、awesome-algorithms 之類的整理也很夠用了。
祝大家準備愉快!