iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 1
6
Software Development

從LeetCode學演算法系列 第 1

[Day 1] 從LeetCode學演算法 - 緒論:你應該知道的面試基礎和解題技巧

寫在前面

容許筆者自我工商一下,如果喜歡這一系列的文章,
我也有陸續寫新的文章,放在我的Medium中,
有興趣的歡迎光臨XD~

其目錄項次會放在第一篇(在Medium上是第0篇),
在上面的主標題內容,會以當篇所著重的演算法/資料結構種類為主,
而不是在這邊所使用的直接以題號命名。
同時,因為Medium有支援gif檔的關係,
讀者有空也可以回頭翻一下一些和這裡對應的文章,
有些會提供動畫圖解,相信會更容易理解。
(將來也會嘗試線上開課,如果喜歡筆者的風格,到時也請多多支持~)

每次更新的時候也會貼在Python Taiwan上,
可以的話,希望在看Medium文章時,
能順手點開底下的SHOW EMBED->給個 5 Like,
您的支持是筆者寫作的動力!

What is an algorithm?

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

Why do we need to learn algorithms?

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

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

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

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

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

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

Why LeetCode?

那麼,現在網路上可以供作練習的網站相當之多,除了LeetCode外,
你可能還聽過HackerRankCodeWar等,
那麼為什麼是用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/09/02)的題目量總共有1178題,Easy佔了當中的319題。
筆者練習的題目總量為359題: Easy 266, Medium 75, Hard 18。
https://ithelp.ithome.com.tw/upload/images/20190902/20119871EBwSIuuay8.png

以筆者的個人經驗,只要將LeetCode的Easy難度寫過一輪,
搭上少量的Medium和些許的Hard題目,便足以應付絕大多數的白板題。
這當中要求的是盡可能不要去翻別人的答案,自己先兜出解法後,
在能力範圍內去盡力提升這個解的速度,
真的不行或卡超過半小時才去參考別人的解答
在練習到一般的白板題都不能難倒你後,
就可以將注意力集中在你主要經驗相關的領域了。
(如筆者找AI職缺,那麼就會偏向ML相關的知識)

What’s the plan?
接下來的系列,將會挑選LeetCode題目練習,
以Easy題目為主,參雜少量Medium題,搭配題目分析及演算法講解,
在整理先前自我學習的過程中,希望能對大家有所幫助。

解題所用的程式語言會以Java及Python為主,但概念基本上不會差多少,
若是使用其他語言的朋友應該也可能從中理解思路。
使用的解有些可能會因為我看到更好的解法,
會使用其他人在Discuss區塊提出來的解,
筆者會盡量標明是哪一位LeetCode user所寫的。
除此以外,
若文章中有錯字、寫錯或有任何讓人感到疑問的地方,
歡迎留言告訴我!


下一篇
[Day 2] 從LeetCode學演算法 - 0001. Two Sum (Easy)
系列文
從LeetCode學演算法30

尚未有邦友留言

立即登入留言