iT邦幫忙

2024 iThome 鐵人賽

DAY 1
0

緣起

此鐵人賽,將挑戰連續刷完9月份daily題。參加週賽,檢視自己的進步程度。
由於已經開刷一段時間,而且很多題目在網路上早已有相當詳盡的中文解說,因此這系列文不是從0到100,也不會由淺入深由淺入淺;而是紀錄我看完每日一題的思路解題過程解題時間和任何WA、TLE、MLE的錯誤(誠實地面對自己)。
除此之外,嘗試將code轉換成口語化能用嘴講解的短文。畢竟能解題是一回事,能邊解題邊講解流程給面試官聽,才是最重要的。

Leetcode介紹

leetcode網站藉由蒐集各大科技公司的面試考題,並用online judge的方式讓使用者練習。
目前leetcode上已經有3000多道題目。全部刷完不太實際,所以可以先參考一些著名的選題指標,如Blind75、Neetcode150等開始刷。
而Leetcode每日一題,會在台灣時間早上8點刷新一題隨機挑選題庫中的題目,他會出現在problem set的最上方

而鐵人賽是24:00截止,因此每天一題我有16小時可以完成並上傳鐵人賽。
如果當天的Daily題解完,面版右上角的月曆就會打勾。如果當日daily未完成,則會留一個紅點。

如果整個月的Daily都有刷完,則會獲得當月的獎牌一個

除了每月獎牌之外,還有連續50天刷題、連續100天刷題等奇奇怪怪的獎牌可以解鎖。
另外,要是當天來不及解完,每個月會有兩次補救(Redeem)的機會!

為甚麼刷leetcode

刷題網站不只有Leetcode,還有codeforcesatcoder,還有外商巨頭公司面試時很愛用的hackerrank
leetcode的好處是不用自己處理輸出入,只要專心想演算法即可,而且我也不是競技程式高手

刷題常見術語

Run: 只跑題目給的範例測資。
Submit: 把題目的function寫完,按下submit就會送出給online judge系統,leetcode會編譯程式並驗證結果。
CE: compile error無法編譯。
RTE: runtime error程式跑到一半出問題了。
TLE: time limit exceed超時! 演算法不夠快
MLE: memory limit exceed使用記憶體過量
WA: wrong answer有測資沒過
AC: all accepted恭喜過關,下面一位

週賽、雙週賽

週賽台灣時間每週日10:30開始,雙週賽台灣時間每隔週六22:30開始。
每次會有四題(通常是1Easy, 2Medium, 1Hard),並且是全新的題目,時間限時一個半小時,很適合拿來模擬面試情境。
週賽時,沒有AC的情況下會看不到錯的測資
AC才有分數,submit沒有AC會在你通過該題後加上penalty懲罰時間。
打完週賽後約三到四天會更新Contest Rating分數。
每次週賽開始前要先去contest按註冊比賽哦~

引導之始

給還沒刷過的小白,或正在刷的小萌新一些我在用的小技巧

VSCode Leetcode extension

推薦在vscode extension中安裝leetcode extension
路徑在左上角File > Preferences > Extensions,搜尋LeetCode
LeetcodeExtension
這個擴充今年初一度因為年久失修無法登入,好在官方最近又有更新,現在按登入可以打開瀏覽器輸入Leetcode帳號來登入了!
所需的requirement只有node.js
我常用快速鍵Ctrl+Shift+P來打我要的功能,如登入、顯示題庫等功能。
當點了一道題目,extension就會自動抓取題目說明顯示在VScode中。還能將function template抓下來產生檔案,支援一鍵submit,是不是很方便?
twosum
有了這個擴充功能,就不用特地打開瀏覽器,只要在VScode上就能快樂地刷題了。如果你超級不想用滑鼠,這個擴充功能的底層還支援command line的用法,看題、寫題全部都在終端機中完成!跟在上班沒什麼兩樣!

除錯技巧

有鑑於我用CPP刷題,C和CPP很容易不小心寫出buggy code,比方說index超出邊界、記憶體忘記釋放等。此時submit後只會得到到RTE,Sanitizer顯示heap buffer overflow之類的錯誤資訊,行數又完全對不上,很難debug。

因此我喜歡在submit之前,先自己在使用sanitizer編譯一次,以確保不會提交愚蠢的錯誤。

GCC Sanitizer

  1. leak
    用於檢查是否有memory leak的問題。
  2. address
    用於檢查記憶體存取錯誤,像是out-of-bounds或use-after-free
  3. undefined
    用於檢查未定義行為(undefined behavior),像是overflow或divide-by-zero

所以我的編譯方式如下:
g++ -lm -g -Wall -fsanitize=integer-divide-by-zero -fsanitize=leak -fsanitize=address -fsanitize=undefined -o a.out cpp/1.two-sum.cpp && ./a.out
如果寫的程式真的有問題,則執行間或執行完就會拋出錯誤,跟leetcode上遇到的錯誤一模一樣,重點是有行數可以參考哪邊出錯。
如果這個月有遇到sanitizer錯誤的話,再來講解如何解讀sanatizer的錯誤。

挑戰才正要開始

目前的小廢廢人權圖
刷過的題目: medium 226題, hard 37題
#Leetcode_Badge
週賽成績: 1766分
leetcode_rating
週賽紀錄: 穩定過1E2M,Hard則是從來沒有時間內AC過

藉由本次的鐵人賽衝刺,紀錄週賽成績,目標就是能第一次四題AC
當然很有可能還是解不出來,所以正如參賽主題所說的: 菜就多練,不會就多刷


下一篇
[9/2] 找換粉筆的傢伙
系列文
菜就多練,不會就多刷31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言