iT邦幫忙

2022 iThome 鐵人賽

DAY 7
2

有些基本的刷題心法筆者就不特別提
像是
不要拿IDE或是vscode等等可以自動標錯的介面來刷題,
要的話也把所有功能像是自動補完那些關掉
白板題之所以叫白板題就是只有白板
其實Leetcode已經會給一些換行完自動縮排或是上色標記了
Google和Amazon實際面試的網站其實連換行完的自動縮排都沒有
雖然我猜大部分主考官不介意,
但有些主考官可能會對面試過程中
變數名稱的typo/關鍵字打錯/該打分號的地方沒打還一直眼殘看不出來超級大扣分
建議刷題就乖乖用leetcode的平台
自己想辦法看懂leetcode runtime error的error msg然後自己找bug在哪
(除非在比賽或是想要寫一些random testcase gen找一些leetcode測資很大的時候才測得出來的bug)


筆者這系列文主要focus on想要刷到500+題或是leetcode rating 2000+的讀者
對演算法或是刷題的超級初心者可能不是太友善,
但還是蠻建議把系列文都讀一讀,知道以後大概會遇到什麼困難或障礙

如果想要刷到500題以上的話 必須要知道的事之一:

(這可能會是本篇文章最有爭議的一個建議
但是如果時光能倒流,我唯一會告訴以前的我自己的一個建議就是這個
請各位自行斟酌這個建議,我覺得最適合我自己但不一定每個人都通用)

在累積刷題到200題以上之前,完全不要浪費時間去想每一題怎麼解

因為LC的題目大部分都會有一些很基本的套路
再從那些套路出發作一些變化和延伸
(哪些套路後面的文章會有比較詳細的說明)

以簡單的國高中數學來舉例
這些基本的200題左右的基本題/經典題就像是每個單元會出現在講義上的例題
雖然這些例題簡單又經典到不行,但好歹也是數學家這2000年內想出來的人類智慧結晶

像是
畢氏定理
用排列組合C推導出重複組合H的公式
ln x 的微分是 1/x

(在有人跟你推導而且證明之後)
這些東西都很簡單而且非常經典

但是叫你自己要在30分鐘內
想出畢氏定理的證明
或是自己用排列組合推導出重複組合的公式等等等等

除非你真的是萬中選一的天才(天才大概也不用來看這篇文章)
不然也沒必要自己折磨自己

常常很多題目也是當年某個博士生的論文題目
窮一己之力想要參透人類智慧結晶就像是人類想要挑戰超大型巨人一樣困難
賠上的只有自己寶貴的時間

比較好的方法是站在巨人的肩膀上
例題聽老師講解(看wisdompeak youtube影片講解)
類似題不會寫的話看同學怎麼寫(看解答區)
最後習題再逼自己多寫幾題
才是國高中以來一路學習的時最有效率的方法

筆者以前總是有個盲目的想法覺得題目一定要靠自己想出來
沒事不去看解答,自己想過答案才會印象深刻
以後碰到類似題才會自己也解得出來

像是以前的看到QuickSelect的題目就會想說QuickSort我會
那我要自己把QuickSelect寫出來!
結果寫了很久就算了,edge case又出bug,不死心一直改code一直submit
最後弄了一兩個小時也沒多學到什麼,看別人的寫法才有恍然大悟的感覺

還不如一開始就去看別人是怎麼好好寫的

這也是新手常犯的錯之一:
一直浪費時間堅持自己的想法自己的code自己鑽牛角尖
(筆者以前真的超常這樣,效率很差,然後就會進入效率差動機低落的惡性循環)
自己思考固然關鍵
但是其實題數/效率才是更關鍵的

以半年內要寫500題為目標的話
看起來每題都花1小時好像每天只要花三小時就可以了

但實際上會發生的事情則是:
如果沒有高效的系統化學習
3個月前自己想出來的題目3個月後早就忘光了
再寫到的時候其實根本不太記得當初怎麼想出來的
所以1天寫3題是遠遠不夠的

另外自己堅持硬幹還有一個硬傷就是會一直懷疑自己的智商
很容易覺得自己好笨想好慢就放棄了
這就跟減肥的時候直接採取最激烈的手段
結果堅持不到三個月就復胖一樣不可取

所以筆者的建議是在累積刷題到200題之前,
如果看到30秒之內想不出來演算法的那些題目
完全不要浪費時間去想,直接看影片詳解
(甚至在500題以前我都建議如此)
看完之後把覺得自己之後應該可以自己做得出來的題目列在一個list裡
兩個禮拜後開始自己試著寫兩個禮拜前list裡看過詳解的題目
唯一要逼自己直接現場想出來的只有weekly 和 bi-weekly contest的題目

(有人就會覺得你就是背答案仔 但筆者認為才是最高效率的作法,
leetcode已經快2500題了,因為掌握了做題該有的思路,
結果被考哪題哪題都會,還算不算是背答案就不好說了)

如果想要刷到500題以上的話 必須要知道的事之二:

套個Huli的標題
當我們在刷題時,要學的到底是什麼?

雖然乍看好像我推薦題目完全不要浪費想,全部都看youtube頻道
但是如果就只看完一堆youtube影片不寫題目或是照抄解答,
也頂多就是變成一個鍵盤演算法專家(雖然厲害的leetcoder也是得用鍵盤比賽...)

Leetcode就是演算法的上機作業
有修過演算法的人都知道,
聽得懂跟寫完submit就AC (Accept aka 測資都對)
之間還是有不小的差距的
在你看了那麼多youtube影片講解跟討論區解答之後
在實際面試的時候最有可能遇到的狀況還是
他出了一題你沒看過的或是你寫過但是忘記的

所以筆者的建議同前段
在看講解的時候覺得自己這題已經理解,
而且題目難沒有超過面試會考的難度太多的話
(problem rating 2400以下應該都在可拿來練習的範圍內,
但若是初學者可以先以medium的題目為主練習)
就把題目的題號記起來,然後兩個禮拜差不多等這題有點模糊之後,再試著一氣呵成AC

也就是說
刷題看講解看解答的時候要學的不是那題本身怎麼解
(這點wisdompeak的youtube頻道就做的非常非常好)

而是學習在看到一個陌生的演算法問題時
如何一步步地從一些簡單(或是套路)的想法出發,很快地自己套套看example case
驗證自己的大方向是不是對的
(巧秒解,智商解,特例解,需要先備知識解那種題目就不算)
這些方向有了之後還可以有什麼的樣子的觀察
然後看到題目還有哪些限制跟可以利用的性質
還有什麼可以預處理壓時間複雜度的東東和條件
最後小心某些假設跟前提,處理好邊界條件跟邏輯
最後透過你寫過很多題目謹慎且細心的能力
在很快的時間內寫出bug free的code

這些絕對都是工作時寫code或是遇到陌生問題的時候非常受用的東西
可能很多人會覺得刷題就是學一些用太不到的演算法
但是趨於現實他也是摸摸鼻子跟著刷題
[北美] Leetcode刷起來 分享刷題之我見- 看板 Oversea_Job
這可以說對也可以說錯,完全取決於你用什麼樣的心態刷題和你想練習什麼能力
有些人刷題可能就是從來不比賽狂背答案狂submit同類型的題目然後只看leetcode AC題數就覺得夠了

但如果目標是放在LC rating不斷上升,甚至參加leetcode以外的coding比賽
少不了的是各種自己想出edge case測資的能力,
在短時間內有壓力之下要迅速想出演算法跟寫出bug free code的能力

至少筆者覺得一路爬到LC rating 2250+的路上(可能對很多ACMer來說還算是幼幼班)
和剛開始的自己相比,在程式上面的各種能力確實提升了不少


其他optional tips(都是以500題+為目標的前提之下):

1. Easy的題目完全沒有花時間去刷好刷滿的價值

再以簡單的國高中數學來比喻:
今天考指考數學,你一直寫基測數學題目寫了500題
本身就是一個超級沒自信找自信的自我安慰行為
甚至寫這些Easy題對你是扣分的因為沒有學到什麼東西
反而壓縮到你寫面試主要考的medium跟hard的時間

2. leetcode premium買不買都可以

筆者刷到現在1000+還是免費仔
a. 因為有些地方可以查到題目
b. 公司的frequency根本沒差,你終究還是要刷500+題而且各種topic都練熟的,為什麼要挑比較常考的先刷?
c. 筆者到現在還沒買premium比較白痴的原因主要是:
每次submit完要再submit一次的時候都會等cd等很久
但後來有一種我現在買了那我之前不就都白等了的心態...(被踹飛)

但如果讀者是那種沒燒錢扔給健身房不會去運動,
沒花錢報名鋼琴課就不會主動練琴的
不花錢不會下定決心的人
那就還是逼自己買ㄅ,一年才5k,
就算漲價變成三倍一年1w5,對轉職成功的薪水加成和學到的東西相比根本微乎其微

3. 找刷題夥伴找的到有加分

但找夥伴也不容易
找到實力差太多又狂吸你經驗值的話反而會扣分

筆者Leetcode在750題前幾乎從頭到尾都自己刷,
後來才在weekly contest排行榜上看到自己學長跑去認親
(大概面試前一個禮拜才發現Orz,好消息是後來一起變成新公司同事)
在刷題這條路上真的是有同儕一起競爭一起扶持打氣一起分享經驗
收穫最多也最有效率
建議沒事不要像筆者一樣一直單打獨鬥

4.應該要全職刷題還是下班刷題?

很多人是有經濟壓力的,沒有經濟壓力也有機會成本的問題
下班刷題的優點:
如果當天被老闆欺負那那天刷題會刷得很有動力
有收入而且面試沒面上不會壓力那麼大
缺點當然就是很累,累到爆,沒什麼時間休息

辭職刷題的話會遇到的問題就是有可能下一間在談薪水的時候
被question前面那段時間在幹嘛,
甚至因為你不是在職就沒必要付挖角的錢來挖你,談薪水變得比較不容易
但是往好處想如果現職薪資本身就過低,如果打死不說上一份工作薪水多少
面試表現又很優秀,那就算你有兩三個月的空窗期,對方可能還是很怕你跑掉,
對薪資來說可能還是會提升不少

但要注意的是因為失去了收入又會有不想吃回頭草的壓力
刷題時和面試時的心理壓力應該也會變大不少

這方面筆者沒有辦法給讀者建議,優缺點都大致列在這邊
建議多請教身邊了解狀況的朋友(ㄜ不過不要傻傻的跑去找同事主管聊這個....)
討論並且自己衡量最適合自己的模式

5. 適時請家教

刷題這條路絕對不是輕鬆的路
如果能有好的/厲害的老師
聽你講你的想法然後跟你講哪裡想錯


a. 根本一開始方向或是想法就是錯的
b. 方向對了但是複雜度不會過所以TLE(Time Limit Exceed)
(可能是因為看不出哪裡可以pre compute 或是其實演算法裡面有很多重複計算優化後其實可以省略)
c. 複雜度ok了但是有些假設或前提或邊界條件有錯或是有些if else進去的邏輯不對或是特例忘記特判
d. 或是整個演算法都對了但就是有奇怪的測資WA小bug
的時候提醒你讓你不要浪費時間debug (雖然說debug本身也是一種寶貴的訓練)
那絕對是可以省去大量的時間和心力而且進步飛快的

所以說如果要最有效率應該還是花錢請家教,
但可能花的錢又更多,面試的時候壓力又更大
還要煩惱找到不太會教的家教或是適應不良的家教之類的
總之同上,請讀者自己評斷


上一篇
今天開始規劃刷題schedule
下一篇
道生一 一生二 二生三 三生萬物 / from 0 to 1 / Leetcode超級菜鳥先寫哪一題
系列文
0到100的軟體工程師面試之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言