在寫超過500題之後的這個階段,
參加leetcode contest時,讀者應該要以寫完前三題為目標了
而且接下來無論是寫了2000題還是寫500題,
leetcode contest rating才是和面試的coding反應速度最相關的(除了一些後面會提到的面試注意事項)
就算寫了2000題也很有可能以前寫的全忘光了,
只寫500題也可能神速的融會貫通
在這個階段要做的就是盡量把面試會考或是有可能考的主題都練熟
看到任何一個題目都要猜的到大致上要往哪個方向去想
而且要盡量增進自己的刷題效率
減少寫出bug的機率跟降低debug時間
增加寫code速度,準備好一些常用模板(之後有一篇文會提供),
操作STL的時候(以C++為例:)
寫substr/操作map iterator/find in multimap之類的語法
不應該要再花時間查了(至少要整理好背起來)
最大幅度的增進自己的刷題效率
才能在倦怠來襲之前練熟大部分的topic
BTW,網路上常常流傳什麼Google不考DP很愛考graph之類的,
絕對...沒這回事,筆者就被考了蠻難的DP
就筆者個人面試兩次(9題)的經驗和網路上打聽,真的沒有什麼主題是G社不會考的
頂多是出現機率高低,尤其DP題目這麼多概念這麼通用,完全不去練習是蠻可惜的
與其去猜題挑自己喜歡或是熟系的寫,不如柿子挑軟的吃把好理解能掌握的通通都學會就對了
筆者再只推薦應該要練習的topic:
(請對照官神Github題目分類整理
再次對官神獻上12萬分的謝意)
Binary Search by Value (聽說有陣子Google很愛考)
Find K-th Element
Hash+Prefix (很多經典題目)
Heap (我比較喜歡叫這類題目 Ordered Set)
Tree
Path in a tree
Lowest Common Ancestor
Tree and sequence
Design
Linked List + hash map of list iterator
經典題: 164. LRU cache, 341.Flatten-Nested-List-Iterator
Monotonic stacks/queue/deque
form smallest sequence (算是比較少考)
Parse expression (這個要很注意edge case.. 但我在某OA被考)
Priority Queue (有點微妙跟Ordered Set大同小異)
Sort+PQ (題目我覺得都很不錯但是面試好像沒那麼常考)
DFS
search in an array (也就是backtrack,注意如何剪枝)
DFS+memorization
BFS
Multi State (少考但我覺得864 https://leetcode.com/problems/shortest-path-to-get-all-keys/ 之類的算是蠻經典的 Cat and Mouse就不要管他)
Trie少考但也是會考是因為很好寫出來所以加減刷一下 (677 https://leetcode.com/problems/map-sum-pairs/ 我覺得很讚)
DP
基本I
基本II
背包
雙序列型
To Do or Not To Do
max subarray
簡單的走迷宮型
這幾個必須把握
其他的...區間型DP和狀態壓縮DP 我也是有稍微準備但是讀者可能不必那麼花心力
Bit Manipulation 筆者個人認為除了做嵌入式的組,不然考這個對面試官來說CP值很低(有一大堆跟演算法有關的題目可以選Orz)
Divide and Conquer 少考加上 LC上的DC題剛好都可以用BIT做...(?)
MergeSort/QuickSort還是要會寫
String
leetcode上標string的大部分問題其實不是string的問題
常常很多是複雜度太高的array題,如果問題的某個n或是k限制在小寫英文字母26,O(2626n)就剛好可以做,就變成字串題了
substring就是subarray的問題,或是也會有一些subsenquence和subset的問題
Rolling Hash比賽好用但是面試不太會特別考這個,不過我在某次亞麻的面試有用到這個技巧
KMP/Manacher筆者完全不想花腦容量去準備XD 面試出現算我衰XD
Min-Max Strategy 其實就是DFS+memorization的變形,好像也蠻少考的
Math
GCD輾轉相除法
質數篩
快速冪(的概念很好用)
排列組合
Distances 296.Best-Meeting-Point的結論很重要,最好連怎麼證明都知道
Random Pick (筆者在G社被考)
Greedy就比較雜一點而且沒什麼general的套路可循,但幾個大主題還是應該要準備好
LIS的變化題
Three pass (這種題目超級多而且很簡單)
Intervals (筆者在G社被考)
Parenthesis
Indexing Sort
Sort
Constructive Problems (筆者在G社被考)
Other
Prefix sum(的概念太基本太常用到了!)
掃描線 / 差分數組 (筆者覺得這個超常考!在G社也被考了!)
Aggregate Subarray by element
結論轉移(這個和上面的題目雖然不常考但是概念非常通用)
好了這篇就是打了一坨拉庫的主題和筆者個人主觀的小小心得
像筆者本身很喜歡追的一個網誌
Jay的跑步筆記
筆者從來沒跑過馬拉松,看他的心路歷程文固然勵志
但就難以體會他每篇文章裡面遇到的痛苦和撞牆和咬牙
對於沒有在刷題或是沒有寫超過300題(所有平台加起來)的人
這些topic以及小心得可能看的輕鬆寫意也有可能看的霧裏看花
但真的一題一題寫過想過的人才能懂得箇中奧妙
剛進入這個階段的讀者可能會覺得
天啊有好多題目好多主題都還不會
但在這個階段就已經不是比誰學的快誰口袋深誰時間多,
而是比誰的氣長,能夠沈住氣一題一題刷到每個主題都熟練
堅持到最後的人才有辦法在面試中拿出好的表現
注:(2022-10-26)
筆者感覺最多人會卡的地方就是這裡
大約是比賽1700~2000左右
我自己後來第二次面試的時候並沒有在這個階段卡住上不去
(但是可能因為我有做到以下的事情)
我覺得可以給的建議是:
多看wisdompeak的影片
我3個月內看了5,600部,與其花時間看解答區直接蹦出一個答案
聽官神仔細講解從概念上要怎麼想跟看他怎麼打code的
讓我當初學到非常多東西
同類型的題目一起寫,寫到自己熟再換下一個
只有自己最了解自己,
筆者看過不少人聲稱他題目寫很多了但是分數還是上不去
但是其實並沒有把大部分常常考(或是比賽常常出的)題型弄熟
筆者當初第二次開始刷題的時候自己評估了一下自己,
整理了這些蠻基本的主題跟自己的能力
最弱 ordered set/math/stack/intervals/DP/greedy/linklist->
string/PQ+sort/min-max/Design/2pointer/sliding-window/resursion->
mono stack|queue/Trie/DFS(backtrack)/Tree/diff array/scanline/hash+prefix->
Graph(BFS/Dji/toposort)/Union Find/binary search 最熟
建議就是把自己最弱的主題密集集中刷,刷到最弱的變最熟的,
自然就不太會看到題目連想法都沒有,至少有可以一搏的餘力
最熟的(通常比較不容易忘記)
多刷多複習,多AC多健康
這點其實可以算是兩點