下面的两块代码是其他人的,我挑选了比较简短的记录一下,这两种都用了正则约束的方法,我不太熟悉,所以用自己的思路写了
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
class Solution:
def myAtoi(self, s: str) -> int:
import re
s = s.strip()
num = re.findall('^[-+]?\d+', s)
if not num:
return 0
ans = int(*num)
return min(max(ans, -pow(2, 31)), pow(2, 31) - 1)
解题思路
我自己的思路,比较复杂一些,一直提交了7次都有错误,按照出错的测试用例调试,最后第8次成功通过,开心。
1.先去掉空格
2.字符串为空或者是以字母开头都直接返回0
3.添加一个空列表m,sign变量用来记录符号
4.如果去掉空格后的s以+或-号开头,则将符号记录到sign中,之后删除掉第一个+或-号,多个时删除一个
5.遍历s,将数字字符添加到m中,如果m读不到数字,则直接返回0
6.判定界限,注意要用带上sign记录的符号,否则都是正数,会出现错误
7. 审题时题目要求超界的话返回界值
8. 其余情况返回0
代码
class Solution:
def myAtoi(self, s: str) -> int:
s = s.lstrip()
if s == "" or s[0].isalpha(): # 字符下标超界,所以加了s == ""
return 0
m = []
sign = 1
if s[0] == '-':
sign = -1
s = s.replace(s[0], '', 1) # 如果有多个-号,会删除前面多个,所以换成了replace方法
elif s[0] == '+' :
sign = 1
s = s.replace(s[0], '', 1) # 多个+号都会被删除,换成了replace
for i in s:
if i in ['0','1', '2', '3', '4', '5', '6', '7', '8', '9']:
m.append(i)
else:
break
if m == []:
return 0
if -2**31 < sign * int(''.join(m)) < 2**31 - 1: # 起初判断的时候没有乘sign,相当于是绝对值
return sign * int(''.join(m))
elif sign * int(''.join(m)) < sign * -2 ** 31 or sign * int(''.join(m)) == -2**31:
return -2**31
elif sign * int(''.join(m)) > 2 ** 31 - 1 or sign * int(''.join(m)) == 2 ** 31 - 1:
return 2**31 - 1
else:
return 0