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