Python刷題之路,怎樣做才能讓技術(shù)突飛猛進

1
比你優(yōu)秀的人比你還努力
這個世界最可悲的就是 , 比你優(yōu)秀的人比你還努力
偶然的機會,通過Python認識了一位華為的文職工作人員。起初只是問我,Python初學者看什么書能快速入門。而兩個月過后,她已經(jīng)開始每天在Leecode上刷題了。雖然有時半夜微信收到她刷題刷到崩潰的消息,或者針對部分Python語法的疑問,但作為一位文職大廠的優(yōu)秀員工,她卻比很多本該靠著代碼吃飯的人更為努力。

今天這篇文章,就寫給那些希望學習Python,但在刷題路上迷?;蛘哒也坏椒较虻呐笥褌?。文章僅代表個人觀點,不喜勿噴。
1
Leecode刷題
起初學習python,我就是秉承著什么好玩學什么的想法,東一榔頭西一棒子的跳著模塊學習??粗芏喾矫娑加兴婕?,但遇到正兒八經(jīng)的開發(fā)代碼時,就歇菜了?;A(chǔ)的字符串、列表、字典操作,都經(jīng)常出錯。后來才意識到,為了學習模塊而去學習,那只是高屋建瓴,底子差是硬傷。

一開始看到菜鳥教程上有Python100練,就在網(wǎng)上找了個打包好的全套練習題,PDF下載地址在我之前發(fā)的文章中:
Python面試的一些心得,與練習題分享
這套題型挺全面的,但是基礎(chǔ)和算法的內(nèi)容比較少,所以開始去Leecode刷題。今天就借著前幾天這位朋友問的一道題,談?wù)勅绾卧谒㈩}中終結(jié)知識,提高刷題效率吧。
1
刷題案例
在引用朋友的代碼前,提前和她打了個招呼:

我真的是很認真去寫文章的,第一句話只是寒暄而已,大家忽略就好,哈哈….
先來看看這道題,原題地址(https://leetcode-cn.com/problems/reverse-vowels-of-a-string/):
編寫一個函數(shù),以字符串作為輸入,反轉(zhuǎn)該字符串中的元音字母。
示例 1:
輸入: "hello"
輸出: "holle"
示例 2:
輸入: "leetcode"
輸出: "leotcede"
有時候示例害死人,剛看這兩個示例,你可能以為提供的字符串都是只有兩個元音字母,然后我們找到它們,互換位置即可。其實仔細想想就該明白,字符串肯定是隨機的。然后,我們通過朋友的解題代碼,來一步步分析如何通過刷題,積累技術(shù)點,朋友代碼如下:

1
案例分析
讓我們對這份代碼進行仔細剖析
首先,很多朋友會發(fā)現(xiàn)在reverseVowels函數(shù)中,入?yún)⒌亩x與我們?nèi)粘J褂玫牟煌?strong style="font-size: inherit;color: inherit;line-height: inherit;">(s:str) -> str
在Python中3.5,PEP 484 - Type Hints附加了一個含義:->用于指示函數(shù)返回的類型。類型提示與括號內(nèi)的類型定義語法,都只是建議但不強制,所以很多教材與代碼中,并未添加。大家知道即可….
首先,有一個明顯的問題,在while的第一個if中存在一個continue,仔細看代碼,這里的continue完全用不到…
我們看到代碼定義了i、j兩個列表的index值,用于從兩邊到中間依次遍歷,最終進行替換。但還定義一個result的列表,用于在遍歷過程中一次賦值??蛇@里,暴露出了一個python變量數(shù)值互換的小技巧。a,b =b,a
而代碼中的else:if … 完全可以替換為elif…
下來看看代碼報錯的這一行,乍一看感覺這行代碼應(yīng)該沒問題啊。創(chuàng)建了一個空列表,然后把string的第0個字符傳輸給這個空列表。為什么會報錯呢?看看下面的代碼就知道了:
1a = [1,2,3]
2b=[]
3b[0] = a[0]
4output:
5Traceback (most recent call last):
6 File "<input>", line 1, in <module>
7IndexError: list assignment index out of range
8
9a = [1,2,3]
10b=[2]
11b[0] = a[0]
12b
13output:
14[1]
1
最終代碼
整理過剛才的幾個問題點,讓我們最后修改后執(zhí)行看看:
1class Solution:
2 def reverseVowels(self, s: str) -> str:
3 vowels = list('aeiouAEIOU')
4 list_s = list(s)
5 i = 0
6 j = len(s) - 1
7 while i < j:
8 if list_s[i] not in vowels:
9 i += 1
10 elif list_s[j] not in vowels:
11 j -= 1
12 else:
13 list_s[i], list_s[j] = list_s[j], list_s[i]
14 i += 1
15 j -= 1
16 return ''.join(list_s)
如果大家在平時做題的時候,能針對每一步都仔細思考下,是否有優(yōu)化空間,涉及到了那些知識點,那么才算是真正合格的刷題思路。刷題不是追求數(shù)量,而是看中是否在刷題過程中有所收獲。
推薦閱讀:
入門: 最全的零基礎(chǔ)學Python的問題 | 零基礎(chǔ)學了8個月的Python | 實戰(zhàn)項目 |學Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》 | 38年NBA最佳球員分析 | 從萬眾期待到口碑撲街!唐探3令人失望 | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個海量小姐姐素描圖 |
趣味:彈球游戲 | 九宮格 | 漂亮的花 | 兩百行Python《天天酷跑》游戲!
AI: 會做詩的機器人 | 給圖片上色 | 預(yù)測收入 | 碟中諜這么火,我用機器學習做個迷你推薦系統(tǒng)電影
年度爆款文案
點閱讀原文,領(lǐng)廖雪峰大數(shù)據(jù)視頻資料!

