法一:if-else
题目没审清导致细节问题多。
执行用时: 56 ms , 在所有 Python3 提交中击败了14.32% 的用户
内存消耗:14.8 MB , 在所有 Python3 提交中击败了90.40% 的用
添加对0的判断,性能提高。
执行用时: 40 ms , 在所有 Python3 提交中击败了86.12% 的用户
内存消耗:14.8 MB , 在所有 Python3 提交中击败了85.19% 的用户
class Solution:
def myAtoi(self, s: str) -> int:
mn=-2**31#1<<31位运算更快
mx=2**31-1
flag=1
num=''
i=0
while i<len(s):
while i<len(s) and s[i]==' ':
i+=1
if i<len(s) and s[i]=='-':
flag=-1
i+=1
elif i<len(s) and s[i]=='+':
i+=1
'''
添加对0的判断,性能提高。
while i<len(s) and s[i].isdigit() and len(num)<11:
if s[i]!='0' or num:
num=num+s[i]
i+=1
'''
while i<len(s) and s[i].isdigit():
num=num+s[i]
i+=1
break
if num=='':
return 0
if mn<flag*int(num)<mx:
return flag*int(num)
elif flag==1:
return mx
else:
return mn
法二:有限状态机
执行用时:44 ms, 在所有 Python3 提交中击败了69.22%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了59.52%的用户
mx=(1<<31)-1
mn=-(1<<31)
class Solution:
def myAtoi(self, s: str) -> int:
automaton=Automaton()
for i in s:
automaton.get(i)
return automaton.sign*automaton.ans
class Automaton:
def __init__(self):
self.state='start'
self.sign=1
self.ans=0
self.table={
'start':('start','signed','in_number','end'),
'signed':('end','end','in_number','end'),
'in_number':('end','end','in_number','end'),
'end':('end','end','end','end')
}
def get_col(self,c):
if c==' ':
return 0
elif c=='+' or c=='-':
return 1
elif c.isdigit():
return 2
else:
return 3
def get(self,c):
self.state=self.table[self.state][self.get_col(c)]
if self.state=='signed':
self.sign=-1 if c=='-' else 1
elif self.state=='in_number':
self.ans=self.ans*10+int(c)
self.ans=min(self.ans,mx) if self.sign==1 else min(self.ans,-mn)
法三:正则表达式匹配
python使用正则表达式(Regular Expression)超详细
执行用时: 48 ms , 在所有 Python3 提交中击败了48.06% 的用户
内存消耗:14.9 MB , 在所有 Python3 提交中击败了 64.12% 的用户
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
'''
import re
class Solution:
def myAtoi(self, str: str) -> int:
INT_MAX = 2147483647
INT_MIN = -2147483648
str = str.lstrip() #清除左边多余的空格
num_re = re.compile(r'^[\+\-]?\d+') #设置正则规则
num = num_re.findall(str) #查找匹配的内容
num = int(*num) #由于返回的是个列表,解包并且转换成整数
return max(min(num,INT_MAX),INT_MIN) #返回值
'''
^:匹配字符串开头
[+-]:代表一个+字符或-字符
?:前面一个字符可有可无
\d:一个数字
+:前面一个字符的一个或多个
\D:一个非数字字符
*:前面一个字符的0个或多个