刷起來! leetcode

leetcode 可以說是工程師的試煉場,收集了許多公司的面試考題,可說是題海無涯,那麼就開始刷題之旅吧! leetcode 可以直接用 github 帳號登入,不用另外申請帳號,非常方便。

選擇選單列的 Problems 就可以看到題目列表了!

leetcode 很貼心依照題型做分類,這邊選擇 expand 可以看到更多分類。

如果想練習特定類型的題目,可以直接點選該分類,就會看到所有相關的題目囉!像是雙指針 Two Pointers

不過如果你沒有想練的特定類型的題目也沒關係,下面的題目列表可以做初步的篩選,一開始先篩選出 easy 的題目來練習吧! 不過如果你天生神力,直接挑戰 medium 難度以上的題目也是沒問題的!Acceptance 是題目的通過率,越低代表通過的人越少。

右邊會有個小小面板紀錄你的刷題情形,提醒你”題海無涯”。

讓我們直接選一題來開始解題吧!,畫面的左邊是題目敘述,看完敘述如果有看沒有懂,可以搭配 example 來理解題目要表達的意思。

右邊則是解題區域,可以選擇自己熟悉的程式語言來解題

作答完之後,可以按右下角的 Run Code 來看第一次 test case 看有沒有通過,如果有通過,覺得自己寫的差不多了,就可以按下 Submit 了。

這時候題目就會開始跑很多 test case,以下面那題的例子來說,有 1032 個 test case,如果有些 edge case 沒考慮到的話,你的程式碼可能就爆掉了,不會通過測試,接著就會看到下面這樣的訊息,輸入-123 預期要輸出-321,結果卻是輸出 NaN。

甚麼是 edge case?— 邊界條件,測試程式在一些很極端的情況或條件下執行,是否還能正常運作。

假如我們成功通過了所有的 test case,恭喜你! 就會看到 Success 的畫面,告訴你程式的執行時間和執行效率跟其它提交者相比快了多少,以及記憶體的用量狀況,下面的 next challenges 則是推薦相關或是相似的題目給你。

備註:因為 leetcode 的頁面在 2022 改版了!所以會跟下面比較早期的截圖長不一樣,請見諒!

下方會列出你的歷史提交紀錄,這邊稍微解釋一下 status 個別代表的意思

  • Accepted —  解題方法通過了所有的 test case
  • Wrong Answer - 解題方法並沒有通過全部的 test case
  • Output Limit Exceeded: 超過輸出長度,提交前記得要把 console.log 註解或是拔掉,不然就會看到這個錯誤訊息了
  • Runtime Error: 執行時間錯誤,題目希望解題的時間複雜度為 O(n)但你的解法卻是 O(n²),或是不小心寫了無窮迴圈

上面表格裡的 status 都可以點擊,就會看到每個提交答案執行時間的分布,看你落在哪個區間,有 PR 值的既視感。

點擊柱狀圖的話,會跳出一個彈窗,顯示那個時間區間提交的程式碼內容,這時候就可以參考一下別人的寫法為甚麼執行效率比較好。

不過有些題目真的是想破頭都不知道怎麼解阿! 不是付費會員又不能看 solution,該如何是好呢?之前都會 Google leetcode xxx answer 看別人的解法,其實根本不用這麼麻煩,可以去點擊左上角頁籤的 discuss,裡面有很多人分享自己的解法。

在 discuss 裡面可以在右邊的標籤區選擇程式語言或是解題技巧的分類,假設我們想看 javaScript 的解題方法,就點選 javaScript 的標籤。

就可以看到用 javaScript 作答的解題內容了,可以趁這個機會看一下別人的解題思路!

以上就是 leetcdoe 的基本介紹,其實刷 leetcdoe 的過程很有趣,寫出來的時候很有成就感,寫不出來的時候很苦惱,但必須說這是需要刻意練習的,在 ptt 上看到大神分享刷題進 Google 的故事,特別設計了一套刷題的訓練如下

  • easy 限制只有 10 分鐘的作答時間,medium 20 分鐘,hard 30 分鐘
  • 只能按 submit,不準按 run code
  • 跟讀書會的其他人交流解法,討論是否還有優化空間

看完只能說奉上我的膝蓋,這真的是需要毅力跟恆心才能辦到,不過上述流程對於平凡人實在是太硬了,還是先依照自己的節奏來練習,可以培養每周刷幾題的習慣,維持解題的手感,祝大家刷題愉快!