Python小白 Leetcode刷题历程 No.6-No.10 Z 字形变换、整数反转、字符串转换整数 (atoi)、回文数、正则表达式匹配
写在前面:
作为一个计算机院的大学生,总觉得仅仅在学校粗略的学习计算机专业课是不够的,尤其是假期大量的空档期,作为一个小白,实习也莫得路子,又不想白白耗费时间。于是选择了Leetcode这个平台来刷题库。编程我只学过基础的C语言,现在在自学Python,所以用Python3.8刷题库。现在我Python掌握的还不是很熟练,算法什么的也还没学,就先不考虑算法上的优化了,单纯以解题为目的,复杂程度什么的以后有时间再优化。计划顺序五个题写一篇日志,希望其他初学编程的人起到一些帮助,写算是对自己学习历程的一个见证了吧。
有一起刷LeetCode的可以关注我一下,我会一直发LeetCode题库Python3解法的,也可以一起探讨。
觉得有用的话可以点赞关注下哦,谢谢大家!
········································································································································································
题解框架:
1.题目,难度
2.题干,题目描述
3.题解代码(Python3(不是Python,是Python3))
4.或许有用的知识点(不一定有)
5.解题思路
6.优解代码及分析(当我发现有比我写的好很多的代码和思路我就会写在这里)
········································································································································································
No.6.Z 字形变换
难度:中等
题目描述:
题解代码(Python3.8)
class Solution(object):
def convert(self, s, numRows):
if numRows<2:
return s
res=["" for i in range(numRows)]
j,flag = 0,-1
for ch in s:
res[j] += ch
if j == 0 or j == numRows-1 :
flag=-flag
j += flag
return "".join(res)
解题思路:
这个题,其实就是输入一个字符串,再输入一个数字n,创建n个字符串,将输入的字符串中的字符,依次输入进str[1]到str[n]再倒着输入回str[1]如此反复,最后输出str[1]+str[2]+……+str[n]。
实际操作中,我们先通过res=["" for i in range(numRows)]创建n个字符串(“”是空str,[]是空list),再控制字符串循环输入到n个字符串中,最后用 return "".join(res)将n的字符串相连输出。
No.7.整数反转
难度:简单
题目描述:
题解代码(Python3.8)
class Solution(object):
def reverse(self, x):
flag=0
if x<0:
flag=1
x=-x
x=str(x)
x=x[::-1]
x=int(x)
if flag == 1:
x=-x
if x<-2147483648 or x>2147483647:
return 0
return x
解题思路:
设置一个flag记录正负,先把x变为非负整数,将x转换为str形式,运用切片的操作将字符串反转,再还原成int形式,赋予正负号,判断是否满足条件输出即可。Python切片操作具体内容我在第9题‘或许有用的知识点’中写出。
No.8.字符串转换整数 (atoi)
难度:中等
题目描述:
题解代码(Python3.8)
class Solution(object):
def myAtoi(self, s):
flag=0
l=len(s)
for i in range(l):
if s[i]==' ' or s[i]=='+' or s[i]=='-':
continue
if '0' <= s[i] <= '9':
flag=1
break
else:
break
if flag ==1:
flag1=0
flag2=0
for i in range(l):
if not( '0' <= s[i] <= '9' ): #不是数字
if (s[i]=='+' or s[i]=='-')and(flag1==0): #正负号
if flag2==1:
s=s[:i]
break
flag1 =flag1+1
if (s[i+1]=='+' or s[i+1]=='-' or s[i+1]==' ')and(flag1==1):
s=0
break
continue
if (s[i]=='+' or s[i]=='-')and(flag1==1):
s=s[:i]
break
else: #空格
if flag2==1:
s=s[:i]
break
else: #是数字
flag2=1
s=int(s)
if -2147483648 <= s <= 2147483647:
return s
if s < -2147483648:
return -2147483648
if s > 2147483647:
return 2147483647
else:
return 0
或许有用的知识点:
re.findall 的简单用法(返回string中所有与pattern相匹配的全部字串,返回形式为数组)
str.lstrip([chars])用于截掉字符串左边的所有chars,s.lstrip()是去掉s左边所有的空格,
因此re.findall()中返回一个list其中包含所有能findout的元素,显然,本处list只有一个元素,
我们用re.findall()对这个list拆包,得到这个list中唯一的元素,再转换成int形式,
其他的根据下图都很容易明白。*
解题思路:
这个题真的是烦死我我了,要考虑的情况太多了,经常有答案不通过才发现题干隐藏这别的要求。我用的是for循环遍历判断的方法,十分麻烦,这个题用Python的话强推正则表达式,一行,就一行,就解决了我麻烦了我半个钟头的题,python的正则表达相关内容我在本题‘或许有用的知识点’中写出。
优解代码及分析:
优解代码(Python3.8)
class Solution:
def myAtoi(self, str: str) -> int:
return min(max(-(2**31),int(*re.findall('^[\+\-]?\d+',str.lstrip()))),2**31-1)
## min max 的判断; 由一个+-和多个数字组成; 消除前端空格
分析:
运用了正则表达式,python的正则表达相关内容我在本题‘或许有用的知识点’中写出。
No.9.回文数
难度:简单
题目描述:
题解代码(Python3.8)
class Solution(object):
def isPalindrome(self, x):
x=str(x)
return x == x[::-1]
或许有用的知识点:
切片操作:通常一个切片操作要提供三个参数 [start_index: stop_index: step] :
start_index是切片的起始位置
stop_index是切片的结束位置(不包括)
step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。
解题思路:
这道题就体现Python切片功能的强大了,先把int型的x转换为str型,然后对x反向切片看与原来x是否相等,返回判断的布尔值。
No.10.正则表达式匹配
难度:困难
题目描述:
题解代码(Python3.8)
class Solution(object):
def isMatch(self, s, p):
return True if re.match('^'+str(p)+'$',s) else False
题解思路:
这题我偷懒了,如果想锻炼算法的话应该用动态规划慢慢做。我是想着正好再前几个题中学到了Python的正则表达式,就在这里用了一下,算是偷懒了。python的正则表达相关内容我在第8题‘或许有用的知识点’中写出。