iT邦幫忙

2022 iThome 鐵人賽

DAY 9
4
Software Development

0到100的軟體工程師面試之路系列 第 9

1 to 75 then 169 (與新手常犯的錯)

  • 分享至 

  • xImage
  •  

以筆者長期潛水在leetcode FB社團和line群的觀察
絕大部分的工程師是沒有在寫Leetcode的(不唬爛),
就算有寫也沒超過50題(扣掉easy)
就算寫了超過50題但也都是很久以前寫的早就忘光了

一是很多人沒有想要換工作(而且也不是說要換工作就一定要刷題)
二是很多人沒有時間刷題或是根本就排斥刷題行為 (而且也不是說要換工作就一定要刷題)
所以願意把75題到169題扎扎實實的寫完,就已經勝過80%的人了


Grind 169

很多開始接觸leetcode準備要投入心力刷題的人最大的問題就是
現在總題數已經快要2400題了
哪些才是上上篇文章講的基本題/經典題
哪些是公司很愛考的題,該從哪些題目開始寫

(其實筆者最一開始接觸leetcode的時候大概只有500題
那個時候也不流行什麼blind75,所以就最流行第一題開始往下寫,然後第4題就卡關XDDD)

好險
幾乎每個人都有同樣的困擾
所以很久以前就有一個厲害的人選了75題經典題,叫做Blind75
(後來聽到別人在刷題第一件事情就是問他Blind75刷完沒, 後來擴充到169題)

在soft job的文章 軟體職缺準備心得- 看板 Soft_Job - 批踢踢實業坊
我發現那個厲害的人已經弄好一個厲害的網站幫你把最基礎的刷題之路規劃的妥妥當當了XDD
https://www.techinterviewhandbook.org/grind75?hours=10&weeks=15

讀者可以利用這個網站自己規劃自己想要用多少禮拜準備刷題
以及每個禮拜大概有多少準備時間
它會從簡到難直接幫你排好每週應該要做哪些題目跟每題大概要花多久
(我的理解是這題你最多應該要花多久)

筆者現在最推薦的入門題庫就是這些169題
(稍微看過覺得題目選的都很不錯)
如果你已經刷過上一篇文章推薦的easy而且覺得沒什麼難度,
或是讀者本身就是電資背景畢業的已經有一點點基礎了,就建議直接把這169題照他的進度完刷
(如果是超級新手請先回到上一篇文章按部就班切莫急就章)


總題數在1~169題之間的注意事項

如同上上篇文章講的 筆者個人建議
在累積刷題到200題以上之前,完全不要浪費時間去想每一題怎麼解
但很重要的是"不要浪費時間想怎麼解"不代表看完解答區抄一遍AC這題就結束了
leetcode是演算法的作業,就算知道演算法,
關掉解答自己重新coding一遍弄到AC
過程中初學者還是會卡到不行
有點像是刷完169題的人回去寫一些超簡單的easy基本上都能寫完一次AC
比較厲害的高手就是無論難度,都可以做到在演算法想對的情況下,寫完code按下去一次AC
(可以去看每次週賽的前20名,那種難到不行的hard題目可以5分鐘內寫完然後一個蟲蟲都沒有...)

就算心裡已經知道正確的演算法
新手還是很有可能code打完還是連compile都噴error,
再來也很有可能自己想的那些example case的答案都是錯的
之後改了改code再開始一直在沒想到的case上WA

這些都是還不太熟悉如何把"對的演算法"轉變成"對的code"的過程
就算是遇到已經知道答案的題目還是要花一點時間好好練習這個能力


最最常犯的錯

另外筆者覺得在寫1~169題這個區段的新手
最最最常犯的錯就是對一些不太重要的問題鑽牛角尖(aka 浪費時間)

尤其新手對自己寫出來的code常常有一些莫名的執念
https://ithelp.ithome.com.tw/upload/images/20221112/20152262dvdADUmLbh.jpg
(Trust me, 99% SWE write shit codes including you and me)

在遇到bug的時候很可能會想要回去看自己的code跟解答的code有哪裡不一樣
如果你的code跟解答的code寫得很像,5分鐘之內看的出來問題那就很好
但是如果code跟解答大相逕庭,或是看起來87%像了但是就是找不到bug
筆者覺得對新手而言(尤其是medium以下的題目),與其堅持在自己的code屍體上花很多東改西改
不如全部砍掉想想看為什麼別人可以有系統地每次都寫出可以一次AC的code

以筆者在line群的潛水經驗(FB社團不是匿名都沒人敢發文)
列出一些新手可能會鑽牛角尖的地方

  • 堅持要把自己的code的bug找出來(這很好但花太多時間就不好)
  • 糾結常用的資料結構要不要每次都自己刻一遍,擔心沒練習被問刻不出來(這點要特別拿出來講,不要再自己刻sort或是shuffle/split/replace/substr或是有的沒的data structure拉...)
  • 堅持要把memory和runtime都要弄到beat 90%+才換到下一題(先寫到500題重要多了...)
  • 深究很極端的case的時間複雜度和複雜度的定義
  • 深究一些python的奇技淫巧和語法
  • 深究lee215等大神的一些巧妙解到底在寫啥

另外在這邊回答一些看到的鄉民問題 (2022/11/12新增)

有些解都是某個演算法或數學理論 沒寫過根本做不出來
想問一開始做Easy要常常查演算法或看解答是正常的嗎?

對,正常到不行,雖然筆者沒有實際認真讀過網路上的演算法教材,
不確定哪個是最好的(上兩三篇應該有稍微推薦一些)
但是確實就算是Easy只要演算法不會, 沒聽過,90%的天才也做不出來

但我蠻不同意那些“先去學完演算法的online course再來刷題”的建議
除非你時間很多而且動機很強而且有乖乖做演算法的作業(不就是寫leetcode嗎..)還有期中期末考

個人覺得最好的方式是一邊學演算法(不管是課本還是線上教材)一邊練習Leetcode
比只去看演算法的課程效果跟效率都要好上非常多

另外200題前真的就是"不會就看解答"比較合適

等Easy刷完再做Medium會比較上手?
還是大家會先做同一個topic 從easy->medium先刷完再換topic?
我覺得刷同topic的作法有點像是先偷看答案

對,新手很有可能會這樣想
而且還會擔心會不會偷看答案做效果不好
或是擔心一直寫同一個topic是不是會把那個topic寫完

但是
1.leetcode有快兩千五百題
2.(如果一直有在寫題目)這個月寫的題目三個月後就會忘光了
題目不夠這點是絕對不用擔心的

另外刷同一個topic也是我唯一推薦的題目寫法(在2000分之前)
因為topic跳著寫吸收的效果奇差無比
重點是你有沒有好好理解那個topic
寫完之後五個月真的遇到面試題目是同一個topic的時候能不能做對
(要說這是背答案... who cares..
你有至少20個topic, 1000+題要背...)

你可能不知道的 Leetcode 小知識
給面試官的出題建議 / 如果不考Leetcode那要考什麼?
有一些補充

我目前的做法是想不出來看答案 然後過幾天再做這題
主要是想知道思路 抄答案比較像用背的 不是理解的

想知道思路=> 請專心看大神的講解影片
思而不學則殆 站在大神的肩膀上


要記得如果是目標刷到500+,熟悉大部分topic,衝擊TierB以上的公司
以長期規劃來說,比如說預計半年要寫到500+
那一天至少要寫3-4題以上(因為寫過的題目兩個月之後就會忘的一乾二淨,這很正常)
而且別忘了這3-4題還是有不少數量的hard

如果以這個目標和每個禮拜能空出來刷題的時間來看
把時間花在複習寫過的題目都來不及了
根本不會有時間去做類似的對面試幫助非常有限的牛角尖行為

討論困難的複雜度跟大神的奇妙技巧很好
但是建議先等寫到500+或是分數2000+之後再來深度討論
如果不是興趣而是以衝擊面試拿到offer為目標
筆者相當不建議這種捨本逐末的低效率行為(自己以前也是受害者)

所以建議時時警惕自己有沒有在浪費時間

不要鑽牛角尖

不要鑽牛角尖

不要鑽牛角尖

很重要說三遍


題外話 另外兩個很熱門的leetcode內建 list
Top Interview Questions
Top 100 Liked Questions

這些題目都還不錯,而且有些面試官沒時間準備的話也通常就從這裡面挑題目出來考
但因為這些題目大部分都比較舊一點
可能沒有cover到所有常常會考的topic
Grind169裡面還是有很多跟這兩個liist重複的題目 尤其有進度規劃實在很讓人有目標感
建議以169為優先


筆者也幫忙列出1~169題必備的topic

hash table
linked-list
binary tree and recursion and dfs
stack and dfs
queue and bfs
用到 prefix sum的題目
簡單的 binary search 題目
經典的 greedy 題目
經典的 two pointer 題目 (雙指針或是滑窗或是快慢指針)
經典的 DP 題目
簡單的 heap/ordered set
簡單的 string

初學者的這169題是基礎中的基礎
基本上面試會考的題目都是從這些topic衍生出來,
一開始沒看過可能會卡住是很正常的
其他的題目寫一寫回頭就會發現用到的觀念其實是這邊跑出來的
所以其實常常會複習到這些題目

筆者這系列文對前169題的著墨不多,就寫到這樣而已
也完全沒有講解leetcode任何一題
但如果無論你是想要刷超過1000題還是想要刷個75題左右練手感就好
這前169題是最重要的部分
刷到500題熟了以後回頭再來看就都會覺得這些題目其實都很簡單很套路
希望讀者就算遇到困難也是盡量上網看youtube講解想辦法吸收消化融會貫通
不要卡在這個階段
(因為後面的階段比較值得卡住(?))


上一篇
道生一 一生二 二生三 三生萬物 / from 0 to 1 / Leetcode超級菜鳥先寫哪一題
下一篇
思而不學則殆 站在大神的肩膀上
系列文
0到100的軟體工程師面試之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
yahetw
iT邦新手 5 級 ‧ 2023-08-17 15:50:46

現在才看到這種優文 /images/emoticon/emoticon02.gif
IT邦新手

我要留言

立即登入留言