1、题目描述
2、思路
我自己的思路就是使用多个if-else判断,虽然能解决,但是代码既难看又冗余,把自己的代码贴在下面,方便以后查看:
class Solution:
def myAtoi(self, s: str) -> int:
if len(s) == 0:
return 0
flag = False # 是否是负数,默认是正数
for index in range(len(s)): # 寻找前导空格下标
if s[index]!=' ':
break
if s[index] in '0123456789-+': # 判断第一个非空格字符串是否是负号
if s[index]=='-':
flag = True
index += 1
elif s[index]=='+':
index += 1
else:
return 0
save_str = ''
while index < len(s) and s[index] in '0123456789': # 取数字
save_str += s[index]
index += 1
if len(save_str) != 0:
save_num = int(save_str) # 转换为整数
else:
return 0
if flag:
save_num = 0 - save_num
if -2**31 > save_num:
return -2**31
elif 2**31 - 1 < save_num:
return 2**31 - 1
else:
return save_num
但是看了人家使用python解决的代码,就一行。。。。。。。
使用了正则表达式。直接看代码:
3、python代码实现
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
解释:
^:匹配字符串开头
[\+\-]:代表一个+字符或-字符
?:前面一个字符可有可无
\d:一个数字
+:前面一个字符的一个或多个
\D:一个非数字字符
*:前面一个字符的0个或多个
max(min(数字, 2**31 - 1), -2**31)
用来防止结果越界
s.lstrip()
在不传参数的情况下,默认截取掉了左边的空格。
为什么可以使用正则表达式?如果整数过大溢出怎么办?
题目中描述: 假设我们的环境只能存储 32 位大小的有符号整数
首先,这个假设对于 Python 不成立,Python 不存在 32 位的 int 类型。其次,即使搜索到的字符串转32位整数可能导致溢出,我们也可以直接通过字符串判断是否存在溢出的情况(比如 try 函数 或 判断字符串长度 + 字符串比较)。
补充:
re.findall() 没有匹配时返回[],否则返回全部符合该正则的子字符串;在这里因为输入只有一行,所以结果只能是空列表或者长度为1的列表
* 用来解包,也就是把列表展开。如要将[123]——>123,可以int(*[123])
int() 在输入为空的情况下,会返回0。(也就是说能够处理空列表展开的情况)
4、运行结果:
5、总结:
(1)
re.findall(pattern, string, flags=0)
作用:
返回string
中所有与pattern
匹配的全部字符串,返回形式为数组。
(2)Python 解包骚操作"*"
https://zhuanlan.zhihu.com/p/41968260
(3)lstrip()
s.lstrip()
在不传参数的情况下,默认截取掉了左边的空格。