Python刷题之路,怎样做才能让技术突飞猛进

本文通过一位华为文职人员自学Python并刷LeetCode题目的经历,探讨了如何高效刷题并从中学习。强调了基础的重要性,分析了一段代码的错误和优化过程,提醒读者刷题应注重理解与积累,而非单纯追求数量。同时分享了相关学习资源和推荐文章。

1

比你优秀的人比你还努力

这个世界最可悲的就是 , 比你优秀的人比你还努力

偶然的机会,通过Python认识了一位华为的文职工作人员。起初只是问我,Python初学者看什么书能快速入门。而两个月过后,她已经开始每天在Leecode上刷题了。虽然有时半夜微信收到她刷题刷到崩溃的消息,或者针对部分Python语法的疑问,但作为一位文职大厂的优秀员工,她却比很多本该靠着代码吃饭的人更为努力。

今天这篇文章,就写给那些希望学习Python,但在刷题路上迷茫或者找不到方向的朋友们。文章仅代表个人观点,不喜勿喷。

1

Leecode刷题

起初学习python,我就是秉承着什么好玩学什么的想法,东一榔头西一棒子的跳着模块学习。看着很多方面都有所涉及,但遇到正儿八经的开发代码时,就歇菜了。基础的字符串、列表、字典操作,都经常出错。后来才意识到,为了学习模块而去学习,那只是高屋建瓴,底子差是硬伤。

一开始看到菜鸟教程上有Python100练,就在网上找了个打包好的全套练习题,PDF下载地址在我之前发的文章中:

Python面试的一些心得,与练习题分享

这套题型挺全面的,但是基础和算法的内容比较少,所以开始去Leecode刷题。今天就借着前几天这位朋友问的一道题,谈谈如何在刷题中终结知识,提高刷题效率吧。

1

刷题案例

在引用朋友的代码前,提前和她打了个招呼:

wechart

我真的是很认真去写文章的,第一句话只是寒暄而已,大家忽略就好,哈哈….

先来看看这道题,原题地址(https://leetcode-cn.com/problems/reverse-vowels-of-a-string/):

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入: "hello"
输出: "holle"
示例 2:
输入: "leetcode"
输出: "leotcede"

有时候示例害死人,刚看这两个示例,你可能以为提供的字符串都是只有两个元音字母,然后我们找到它们,互换位置即可。其实仔细想想就该明白,字符串肯定是随机的。然后,我们通过朋友的解题代码,来一步步分析如何通过刷题,积累技术点,朋友代码如下:

朋友的代码

1

案例分析

让我们对这份代码进行仔细剖析

首先,很多朋友会发现在reverseVowels函数中,入参的定义与我们日常使用的不同(s:str) -> str
在Python中3.5,PEP 484 - Type Hints附加了一个含义:->用于指示函数返回的类型。类型提示与括号内的类型定义语法,都只是建议但不强制,所以很多教材与代码中,并未添加。大家知道即可….

首先,有一个明显的问题,在while的第一个if中存在一个continue,仔细看代码,这里的continue完全用不到…

我们看到代码定义了i、j两个列表的index值,用于从两边到中间依次遍历,最终进行替换。但还定义一个result的列表,用于在遍历过程中一次赋值。可这里,暴露出了一个python变量数值互换的小技巧。a,b =b,a

而代码中的else:if … 完全可以替换为elif…

下来看看代码报错的这一行,乍一看感觉这行代码应该没问题啊。创建了一个空列表,然后把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

最终代码

整理过刚才的几个问题点,让我们最后修改后执行看看:

 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)

如果大家在平时做题的时候,能针对每一步都仔细思考下,是否有优化空间,涉及到了那些知识点,那么才算是真正合格的刷题思路。刷题不是追求数量,而是看中是否在刷题过程中有所收获。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

年度爆款文案

点阅读原文,领廖雪峰大数据视频资料!
### 关于LeetCode上使用Python进行编程练习的资源 在LeetCode平台上,通过解决各种编程目可以有效提升Python编程技能[^1]。该平台提供了丰富的目集合,涵盖了不同的难度级别和主领域。 #### 掌握基础知识与技巧 为了更好地利用这个平台来提高自己的能力,建议先熟悉Python的基础语法以及常见的算法和数据结构。这不仅有助于理解问本身,还能帮助编写更高效的解决方案[^3]。 #### 学会正确读取输入 许多LeetCode目涉及处理来自用户的输入数据,如整数、字符串或数组等形式的内容。因此学会如何准确地解析这些信息是非常重要的第一步[^2]: ```python input_data = input() # 获取标准输入流中的内容 numbers_list = list(map(int, input().split())) # 将一行内由空格分隔的一系列数字转换成列表形式存储起来 ``` #### 实践典型例 针对一些经典类型的目多尝试对于积累经验和增强信心很有好处。例如,“两数之和”、“移除元素”等问都是很好的入门级案例[^4]: ```python class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: num_to_index = {} for i, num in enumerate(nums): complement = target - num if complement in num_to_index: return [num_to_index[complement], i] num_to_index[num] = i raise ValueError("No solution found") def removeElement(nums: List[int], val: int) -> int: while val in nums: nums.remove(val) return len(nums) ``` #### 利用官方及其他社区资源 除了直接参与在线竞赛外,还可以访问LeetCode中文版网站获取更多本地化的支持和服务;同时也可以关注其他开发者撰写的博客文章和技术文档以获得额外的学习材料[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值