iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
自我挑戰組

每日攝取一點資料結構和演算法系列 第 29

Day29:刷起來! leetcode

https://ithelp.ithome.com.tw/upload/images/20210928/20128604FEN4QjPpAK.png
leetcode可以說是工程師的試煉場,收集了許多公司的面試考題,可說是題海無涯,那麼就開始刷題之旅吧! leetcode可以直接用github帳號登入,不用另外申請帳號,非常方便。

選擇選單列的Problems就可以看到題目列表了!
https://ithelp.ithome.com.tw/upload/images/20210928/20128604ZThMdydZHf.png

leetcode很貼心依照題型做分類,這邊選擇expand可以看到更多分類。
https://ithelp.ithome.com.tw/upload/images/20210928/20128604nRB3vyeIka.png

如果想練習特定類型的題目,可以直接點選該分類,就會看到所有相關的題目囉!像是雙指針Two Pointers
https://ithelp.ithome.com.tw/upload/images/20210928/20128604Zi4cP3LDu5.png

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

右邊會有個小小面板紀錄你的刷題情形,提醒你"題海無涯"/images/emoticon/emoticon13.gif
https://ithelp.ithome.com.tw/upload/images/20210928/20128604DKJ0JJ3GPn.png

讓我們直接選一題來開始解題吧!,畫面的左邊是題目敘述,看完敘述如果有看沒有懂,可以搭配example來理解題目要表達的意思。
https://ithelp.ithome.com.tw/upload/images/20210928/20128604arXlTW0npY.png

右邊則是解題區域,可以選擇自己熟悉的程式語言來解題
https://ithelp.ithome.com.tw/upload/images/20210928/20128604e1chyuBkXE.png

作答完之後,可以按右下角的Run Code來看第一次test case看有沒有通過,如果有通過,覺得自己寫的差不多了,就可以按下Submit了。
https://ithelp.ithome.com.tw/upload/images/20210928/201286042WtNpwl7Ot.png
按下Run code後 執行一次test case

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

甚麼是edge case?

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

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

下方會列出你的歷史提交紀錄,這邊稍微解釋一下status個別代表的意思
https://ithelp.ithome.com.tw/upload/images/20210928/20128604iuso6TyWXC.png

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

上面表格裡的status都可以點擊,就會看到每個提交答案執行時間的分布,看你落在哪個區間,有PR值的既視感
https://ithelp.ithome.com.tw/upload/images/20210928/20128604MsbBAXXZiQ.png

點擊柱狀圖的話,會跳出一個彈窗,顯示那個時間區間提交的程式碼內容,這時候就可以參考一下別人的寫法為甚麼執行效率比較好。
https://ithelp.ithome.com.tw/upload/images/20210928/20128604bMEPzOqIl5.png

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

在discuss裡面可以在右邊的標籤區選擇程式語言或是解題技巧的分類,假設我們想看javaSript的解題方法,就點選javaScript的標籤。
https://ithelp.ithome.com.tw/upload/images/20210928/20128604nUb0THaRKK.png

就可以看到用javaScript作答的解題內容了,可以趁這個機會看一下別人的解題思路!
https://ithelp.ithome.com.tw/upload/images/20210928/20128604YAoHI9R8b3.png

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

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

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


上一篇
Day28:八皇后問題- 8 Queens Puzzle
下一篇
Day30:完賽心得
系列文
每日攝取一點資料結構和演算法30

尚未有邦友留言

立即登入留言