從LeetCode學演算法 - 0

你應該知道的面試基礎和解題技巧

Chih-Yu Lin

--

What is an algorithm?

所謂的演算法,就是描述一個計算/操作的過程,
這個過程可以用有限的長度來描述如何解決問題。
或者更簡單的說法:
演算法,就是解決問題的方法流程。

Why do we need to learn algorithms?

先講一下筆者的經歷:筆者當了7年多的工程師,當中有2.5年和Android kernel/HAL/framework相關,2年跟Android App和一般Software有關,後面則是ML/Deep Learning為主,在面試時也分別面過不同的職位,唯獨幾乎萬變不離其宗的,就是白板題。

面試官拿出一道你見過或沒見過的題目,問你該怎麼解,
你思考後給出回答,並且討論可以改進的方式及可能的錯誤,
這應該是所有面試者都會歷經的流程。

那麼,你是否經歷過這樣的狀況?

「這個題目的類型看起來好眼熟,可是不知道從何下手,該怎麼辦 QQ」

白板題的重點,就在於演算法。掌握好演算法,就跟數學學會公式一樣,
可以將一些複雜的東西簡單化,平常練習的題目多了,
套起公式來自然得心應手,就算題目再怎麼變,也萬變不離其宗。

當然,後面還會衍生出一個問題:一個題目該用哪種演算法比較好?
但這是另一個故事了,我們以後再談XD

Why LeetCode?

那麼,現在網路上可以供作練習的網站相當之多,除了LeetCode外,
你可能還聽過HackerRank及CodeWar等,
那麼為什麼是用LeetCode而不是其他呢?

以筆者的經驗,HackerRank相當適合做為熟悉語言特性使用,但不適合目標是熟練解題的人。你可以在其 “LANGUAGE PROFICIENCY”的分類中針對特定的程式語言一路寫到尾,這樣可以對這個語言有一個比較基本的認識。
而雖然它們有”Interview Preparation Kit”的部分,但相對題目較為簡單,涵蓋範圍也較少。舉例來說,在Tree的分類上只有5題,這一點點的量,其實相當不足。同時,HackerRank的題目往往較長,限制也通常較多,(這裡是指Problem Solving分類),和一般面試會遇到的題目型態較為不同。
但若今天的形式是給你1個半小時解3題的話,
那麼HackerRank的模式就會很適合你。

Codewar的話,較為偏向打怪(題目)升級的模式,每個題目都會有一個等級,解決題目累積經驗值並提升自己的level會有一種練功的感覺。筆者不推薦的原因在於
1. 網站讀取速度偏慢
2. 題目沒有編號,你會做到不知道哪裡去也不確定自己有沒有準備好XD
3. Discuss區不像LeetCode傾向於分享整組解法

那LeetCode呢?
當前(2019/06/26)的題目量總共有1096題,Easy佔了當中的319題。
筆者練習的題目總量為348題: Easy 266, Medium 65, Hard 17。

2020/08/18:
當前的的題目量總共有1553題,Easy佔了當中的430題。
筆者練習的題目總量為502題: Easy 288, Medium 179, Hard 35。

以筆者的個人經驗,只要將LeetCode的Easy難度寫過一輪,
搭上少量的Medium和些許的Hard題目,便足以應付絕大多數的白板題。
這當中要求的是盡可能不要去翻別人的答案,自己先兜出解法後,
在能力範圍內去盡力提升這個解的速度,
真的不行或卡超過半小時才去參考別人的解答。

在練習到一般的白板題都不能難倒你後,就可以將注意力集中在你主要經驗相關的領域了。(如筆者找AI職缺,那麼就會偏向ML相關的知識)

--

--

Chih-Yu Lin

LeetCode、Python、Java、Android;第11屆iT邦幫忙鐵人賽Software Development組優選(從LeetCode學演算法);HiSKIO特約講師;課程優惠: https://bit.ly/lc2022all ;合作請洽: learnwithdesolve@gmail.com