▲新手軟體工程師必看:LeetCode 學習路徑完全攻略!圖片來源: freepik
文/DCARD-泰瑞
Q1: 為什麼要用CN服?
Ans: 有兩個原因。第一個原因是因為美服的每日一題有Neetcode在做日更了,所以換個賽道;另一方面是,最重要的點還是中文。我個人覺得刷題這件事情的阻力很大,所以如果中文介面會讓你有機會做起來寫兩題的話,真的可以試試看。而且,我個人認為CN的老哥們的題解寫得比印度老哥們的好多了,宮水三葉、靈茶山艾府都是。
Q2: 能不能從最簡單的開始教?
Ans: 這部分可能真的沒有辦法,心有餘而力不足。但是也不用灰心,因為資工方面的知識已經遍地都有了,很多前人都已經做了很棒的教材,所以也才讓我想要寫這一篇,分享一下2024年我個人覺得一個比較好的刷題路徑。
推薦文章>>資工新手如何有效率的準備面試 (coding篇)?
2024年了,不要再為了刷題或是學資工相關的知識花任何的冤枉錢了,我個人覺得就兩個地方值得花錢:
* Leetcode Premium: 可以看到公司tag,提交的時候不會在那邊說你提交得太頻繁卡你。想要省一點的話,可以買力扣(LeetcodeCN)的會員,便宜不少。
* Udemy: 任何資工相關的東西都能在上面用20鎂以內的價格買到,有人整理教材、經營討論社群,真的沒理由不花在這裡。Udemy很常打折,原價反而很稀有,所以看到想要買的課可以先放購物車,等折扣夠大的時候再買就好。轉碼仔像我的話,我有買Docker & k8s, MERN, Django, React,其他都是冤枉錢,也沒有上完。
先選擇一個順手的語言,可以是任何語言,有摸過就好。如果完全沒有想法的話,可以用Python,但Python的隱形缺點在Leetcode的問題就是太方便好用了。slice很方便,寫二分搜索,寫DP記憶化搜索很方便,甚至還有sortedlist這種資料結構,真得太方便。如果是要打算法競賽的朋友,主要是練思路的話可以用Python;但是實際面試的時候,很多時候面試官不會讓你用這麼多library或default function,所以還是不要太依賴。我自己是用Java還有TypeScript在刷題。
有沒有語言基礎都可以開始刷題,透過每一題的練習,可以提升對該語言的掌握度,我TypeScript就是這樣練起來的,要開甚麼不知道怎麼new,就去問一下GPT,很輕鬆的。
Browser extension 建議安裝這個browser extension: Refined Leetcode
https://github.com/XYShaoKang/refined-leetcode
這個extension可以讓你看到題目的難度,在寫題目之前可以看一下這一題的分數,看一下該題的分數和自己分數的差別。
在開始之前想講一下Leetcode的分數是什麼意思,這邊提到的分數是指Leetcode帳號頁面的分數, 如下圖 (順便曬一下我家可愛貓貓):
這個分數是根據你的周賽得成績有對應的變化的,就好像LoL的天梯系統。
假設你現在的分數是1700,這代表你有50%的機率能寫出難度1700的題目,是的你沒有看錯,是50%的機率你能寫出你當前分數的題目。
所以在練習的時候大概用比自己當前分數難100~200分的題目練習就好了,再難一點的題目可能會連題解都看得很費勁。
新手 (大一大二資工系學生、轉碼選手、非資工系出身) 代碼隨想錄:
全部刷完大概有200題,基本演算法、基本資料結構都囊括到了 推薦的原因:講得很細,幾乎每一題都有影片,這一點對我當初轉碼刷題的幫助很大。我當初是每一題都把影片看完,拿紙筆把每一題畫過一次知道在幹嘛之後,才開始coding的 (很花時間,但我自認這一段時間的沉澱幫助蠻大的)。 缺點:太淺了,基本上一刷完就能move on到下一階段了。DP講得不好 (個人觀感)。 使用方式:刷完一輪,跳過DP,然後圖論可以寫一下,然後就可以move on了。2024年了,我不覺得只會這麼基本的題目可以過三輪面試後去外商軟體。
入門 (代碼隨想錄一輪;大三大四資工學生、掌握基本的資料結構、演算法;分數1500左右)
* 比較強一點的同學,這個階段大概周賽就是兩題的水準,第三題基本上寫不太出來,很多時候看到第四題題目會不知道在考什麼。(大概是1550左右)
* 基礎弱一點的同學,這個階段大概是每一個類型的題目都好像看過,但是礙於對語言的掌握不熟、對能用到該題的資料結構、演算法不熟 (例如Binary search下標+1 -1沒辦法流暢coding出來),所以沒有辦法通過題目。(大概1450左右)
這個階段要做的事情如下:
1. 每日一題
2. 靈茶山艾府的基礎算法精講
在新手階段我建議大家跳過隨想錄的DP,這時候就能看靈神的算法精講學DP,我覺得從記憶化搜索的角度出發去學習DP會是一個更好的學習方式。但在學習他的DP之前,需要先把他的Binary Tree二叉樹、Backtracking回溯先看完,才能看DP動態規劃的部份。 這邊放一下DP的網址:
https://www.bilibili.com/video/BV1Xj411K7oF/?spm_id_from=333.999.0.0
這個階段建議繼續沉澱自己,先不要浪費時間打周賽,先把靈神的基礎算法精講過一輪比較重要,每一部影片都會有課後作業,都要好好認真寫。真的過完一輪大概是1700+,這時候再來打周賽比較會有收穫感。
1. 寫每日一題: 一題寫不夠,可以美服、國服都寫,一天兩題,一年就是730題。推薦以下兩個頻道,我自己的和NeetCode
我目前在做Leetcode CN的每日一題的更新,用的是Java,之後會開始更新靈神(靈茶山艾府)的題單
另一個就是鼎鼎大名的Neetcode,老哥用的是Python NeetCode頻道
https://www.youtube.com/@NeetCodeIO
2. 靈茶山艾府的基礎算法精講: 為什麼沒有再新手階段就介紹靈神的基礎算法精講,原因是因為他的難度真的比代碼隨想錄高不少,我個人覺得學習難度對於新手很陡峭。所以比較建議在刷完一輪隨想錄以後,再來看靈神的影片
https://space.bilibili.com/206214/channel/collectiondetail?sid=842776&ctype=0
進階 (基礎算法精講一輪,分數1700+)
這時候的你大概能穩定周賽兩題,第三題大部分時候能寫出來,但是第四題的DP、圖論還是會讓你很難下手,或是寫出來的code會卡最後幾筆測資;大部分的周賽題目怎麼樣都能有一點思路,但是因為沒有刷題單的緣故,有時候會實做不出來,或是做出來了會過不了。
這時候要做三件事:
1. 每日一題
2. 穩定打周賽
3. 刷靈神題單 (最重要)
3.1 題型題單
3.2 難度題單
1. 每日一題: 每日的重要性就是強迫自己要每天打開LC寫個一題兩題,維持手感這一點對於忙碌的打工人、學生非常重要,怎麼樣都要撥出時間來寫一下。尤其是累積了15~20天以後,會有一個強迫感讓自己要上線刷題蓋章。
2. 周賽: 透過參加周賽可以強迫自己去練習遇到陌生題目解決技巧。一開始寫的時候肯定很慌,打個比方就是,知道自己工具箱有一堆工具,但是到了現場看到機台了,會不知道這時候要掏出板手還有螺絲起子。所以會需要打周賽來練習這一步,培養自己遇到陌生題目的解題順序,可能可以先試試看DP,如果超時了再看看能不能用貪心之類的;或是寫了一個DP記憶化搜索,發現還是會超時,可能這時候可以用一個HashMap哈希表來優化一下retrive element獲取元素的時間就會過了。
周賽不是打完就算了,周賽打完之後還要寫檢討,知道自己為什麼這一題會錯,然後正確方法是什麼,還有為什麼正確方法會是正確方法。大概是這種感覺;
這邊推薦看靈神每周日下午兩點的周賽講解直播,這邊放一下他的B站網站
https://space.bilibili.com/206214
3. 刷靈神題單: 這個階段已經算是刷出一個所以然來了,所以需要針對性的訓練,這裡主要分成兩部分:
3-1. 按照題型練習,優點是可以很快地掌握一個新的資料結構或是算法,但是缺點就是會失去分析這一題為什麼要用這個方法的機會,所以需要配合按難度題單來練習。這邊放上靈神的各類題單,他都整理在他的力扣討論了(網址點進去往下拉一點的地方)。
https://leetcode.cn/u/endlesscheng/
3-2. 按難度練習,最為搭配題型題單的練習搭配,這邊放上靈神刷題群組網友做的網站;
https://huxulm.github.io/lc-rating/
這一篇文章花了不少時間整理,都是我個人很主觀的意見和想法,希望對看到最後的你有幫助。台灣的刷題風氣沒有像對岸這樣興盛,所以希望這一篇文章可以拋磚引玉,讓大家都能在刷題這件事情上少走一點彎路,有任何問題都歡迎留言交流。
從二下內心就很焦慮不安,一直到五月從OSU畢業之後更是大爆炸lol,耍廢了一段時間以後,然後就開始每天去圖書館刷題,最後也終於靠刷題讓自己沉澱下來。如果大家現在也是在某個困境裡,不知道要做什麼的話,就刷題吧,反正刷題也不用錢,失業期總是要找事情做的,共勉之。
※文由 DCARD-泰瑞 授權轉載, 原文:《#分享 2024 LeetCode 學習路徑》