Matrix Studio LeetCode 刷题指南
Hello 大家好,我是Alex,今天來說明一下Matrix工作室每日一題的刷題指南,雖然刷題一直飽受詬病,很多人不想刷題,但不可否認(rèn)刷題確實能鍛煉我們的編程能力,相信每個認(rèn)真刷題的人都會有體會。
現(xiàn)在提供的在線編程評測平臺有很多,并且也分了兩個方向,一個是偏向于面試找工作,比較著名的就是LeetCode,另一個是偏向于算法競賽,比較著名的有CodeForce,UVA等等,我們經(jīng)常說的打CF可不是穿越火線,而是CodeForce,這兩個不僅完全沒有關(guān)系,并且難度也不是一個層級的。
咱們今天還是重點(diǎn)說說LeetCode這個平臺,這是一個非常棒的OJ(Online Judge)平臺,收集了許多公司的面試題目,相對其他OJ而言,LeetCode具有很多優(yōu)點(diǎn):
- 題目全部來自業(yè)內(nèi)大廠的真實面試題;
- 不用處理輸入輸出,精力全放在解決具體問題上;
- 題目由豐富的題解,可以參考別人的思路;
- 精確了解自己的代碼在所有提交代碼中運(yùn)行效率的排名;
- 支持多種主流語言:C/C++、Python、Java、Js、Go等等。
廢話不多說,那我們接下來就開始。
一、賬號
用LeetCode之前首先你肯定得有一個賬號,可以是QQ或者微信登錄,也可以用GitHub登錄。
二、每日一題
其實LeetCode是有每日一題的,比如今天的:
一般來說,平常工作日都是簡單或者中等難度的題目,大概十幾分鐘就能解決,有些比較麻煩的可能需要幾十分鐘,周末經(jīng)常會出困難級別的題目,光思路就得想十幾分鐘,實現(xiàn)出來又得十幾分鐘,然后花時間調(diào)試和改bug,最后終于AC(Accepted)了,還得去題解學(xué)習(xí)學(xué)習(xí)大師級別的代碼,基本上一個多小時過去了。
當(dāng)然,咱們工作室的每日一題也會從LeetCode上出,但并不一定是LeetCode上的每日一題,因為考慮到一些大一的同學(xué)并沒有學(xué)過算法和數(shù)據(jù)結(jié)構(gòu),所以各個組長會根據(jù)組員的學(xué)習(xí)進(jìn)度,先從簡單的題目中找適合你們的題目,布置成作業(yè),等大家逐漸熟練之后,會慢慢的轉(zhuǎn)為LeetCode上的每日一題,這樣就統(tǒng)一了。
三、刷題套路
以今天的每日一題:925. 長按鍵入為例,我們進(jìn)入問題詳情頁后:
可以看到左邊是題目描述以及一些輸入輸出樣例,右邊是在線代碼編輯區(qū),我們等會提交代碼就得從這里提交。
簡單讀一下題目925. 長按鍵入,有的時候題目會比較晦澀難懂,尤其是一些英文翻譯題甚至直接就是英文題目,這個時候也不用慌,有的時候題目沒讀懂也沒關(guān)系,我們可以研究研究輸入輸出樣例。
如果能把輸入輸出樣例搞懂了,那也能把題做對。
讀懂了題目之后,我們要做三件事:
這題呢比較簡單,所以我們就簡單說一下思路就可以了。
通過題意可以知道,就是判斷name是否為typed的子序列,我們可以使用雙指針i, j追蹤name和typed的位置,依次判斷當(dāng)前遍歷的字符是否相等,如果不等的話,判斷是否是長按鍵入多次了,如果不是,那就返回False,到最后,如果i = len(name),說明name的每個字符都被匹配了。
然后我們就可以開始寫代碼了,之前我們說過,在LeetCode上我們不需要花時間處理輸入和輸出,它在后臺評判的時候已經(jīng)幫我們做好了,我們只需要實現(xiàn)具體的代碼邏輯。
以Python3為例:
class Solution:def isLongPressedName(self, name: str, typed: str) -> bool:對于還沒學(xué)過類和對象的同學(xué),簡單說一下這是什么,不需要了解具體的意義,知道怎么做就行。
我們一般不直接在LeetCode的在線編輯器上寫代碼,一點(diǎn)都不舒服,所以我們把它復(fù)制到PyCharm,然后寫一個模板:
class Solution:def isLongPressedName(self, name: str, typed: str) -> bool:passif __name__ == '__main__':s = Solution()print(s.isLongPressedName(name="alex", typed="aaleex"))這個模板呢,基本上是通用的,就是在主函數(shù)里實例化一個Solution()對象s,然后通過s調(diào)用相應(yīng)的方法isLongPressedName,能運(yùn)行通之后,我們就可以在isLongPressedName中編寫相應(yīng)的算法邏輯了。
class Solution:def isLongPressedName(self, name: str, typed: str) -> bool:i, j = 0, 0while j < len(typed):if i < len(name) and name[i] == typed[j]:i += 1j += 1elif j > 0 and typed[j] == typed[j - 1]:j += 1else:return Falsereturn i == len(name)if __name__ == '__main__':s = Solution()print(s.isLongPressedName(name="alex", typed="aaleex"))print(s.isLongPressedName(name="saeed", typed="ssaaedd"))print(s.isLongPressedName(name="leelee", typed="lleeelee"))最后我們把寫完的Solution()類復(fù)制回LeetCode的在線編輯器,提交評測,通過了之后,你就可以看到你的代碼在所有提交代碼中運(yùn)行效率的排名,然后還可以分享你的解題思路。
那如果我們寫的代碼邏輯有問題,沒有通過評測呢,我們來試一下提交一個錯誤的代碼:
class Solution:def isLongPressedName(self, name: str, typed: str) -> bool:i, j = 0, 0while j < len(typed):if i < len(name) and name[i] == typed[j]:i += 1j += 1elif j > 0 and typed[j] == typed[j - 1]:i += 1j += 1else:return Falsereturn i == len(name)它會給我們顯示解答錯誤,并且呢提供執(zhí)行錯誤的輸入輸出樣例。
還有一種錯誤是我們的語法有問題,比如我們少了一個冒號:
class Solution:def isLongPressedName(self, name: str, typed: str) -> bool:i, j = 0, 0while j < len(typed):if i < len(name) and name[i] == typed[j]:i += 1j += 1elif j > 0 and typed[j] == typed[j - 1]i += 1j += 1else:return Falsereturn i == len(name)它給我們顯示執(zhí)行出錯,可以看一下錯誤詳情:
它會幫我們標(biāo)注出來哪里出錯,出了什么錯,還貼心的畫了一條紅線。
題解
如果說LeetCode上面的題目是一塊塊金子的話,那么題解就是一個大礦山,多少次當(dāng)你絞盡腦汁終于AC,準(zhǔn)備去題解區(qū)吹牛逼的時候,迎接你的是眾多大師級別的代碼,你就只能高呼臥槽,我怎么沒想到,然后閉關(guān)去思考那些強(qiáng)悍的代碼是什么邏輯,順便默默鄙視了一眼自己的。
所以,AC之后并不是就萬事大吉了,還要去觀摩一下題解,學(xué)習(xí)他們的思路。
好了,今天的分享就到這,拜拜。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Matrix Studio LeetCode 刷题指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1480. Running Sum of
- 下一篇: 763. Partition Label