1 题目描述
2 解题思路
2.1 笨办法
class Solution:
def myAtoi(self, s: str) -> int:
s=s.strip()
#去掉前面的空格
if(s==''):
return 0
#如果全是空格,返回0
if(len(s)==1):
if('0'<=s[0]<='9'):
return(int(s[0]))
else:
return 0
#考虑只有一位的情况
#以下是两位&两位以上的情况:
if(s[0]!='+' and s[0]!='-' and (s[0]<'0'or s[0]>'9')):
return 0
# 首位不满足条件
if((s[0]=='-' or s[0]=='+') and (s[1]<'0' or s[1]>'9')):
return 0
#首位是正负号,第二位不是数字
if(s[0]=='-'):
i=1
while(i<len(s)):
if(s[i]>='0' and s[i]<='9'):
i+=1
else:
break
ret=-1*int(s[1:i])
#负数的情况
elif(s[0]=='+'):
i=1
while(i<len(s)):
if(s[i]>='0' and s[i]<='9'):
i+=1
else:
break
ret=int(s[1:i])
#正数的情况
else:
i=0
while(i<len(s)):
if(s[i]>='0' and s[i]<='9'):
i+=1
else:
break
ret=int(s[0:i])
#“无符号”数的情况
if(-1*pow(2,31)<=ret<=pow(2,31)-1):
return ret
elif(ret>pow(2,31)-1):
return pow(2,31)-1
else:
return -1*pow(2,31)
#截取结果
2.2 自动机
我们的程序在每个时刻有一个状态 s。每次从序列中输入一个字符 c,并根据字符 c 转移到下一个状态 s'。
这样,我们只需要建立一个覆盖所有情况的从 s 与 c 映射到 s' 的表格,即可解决题目中的问题。
接下来编程部分就非常简单了:我们只需要把上面这几个状态的状态转换表抄进代码即可。
INT_MAX = 2 ** 31 - 1
INT_MIN = -2 ** 31
#定义上下界
#以下是自动机的部分:
class Automation:
def __init__(self):
self.state='start'
self.sign=1
self.ans=0 #最终要返回的数字
#初始化自动机,初始状态为'start',一开始默认为正数,结果为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','end']
}
#定义状态转化规则,当前状态,见到不同的字符时,会进入不同的东西
def get_str(self,c):
#读入一个字符,判断它是空格,还是正负号,还是数字,还是其他
#这个对之后自动机状态转换是有帮助的
if(c==' '):
return 0
elif(c=='+' or c=='-'):
return 1
elif('0'<=c<='9'):
return 2
else:
return 3
#return的数值和上面table每行的下标的一一对应的
def get_val(self,c):
#读入一个字符,对其进行相应的状态转化合数值更新
self.state=self.table[self.state][self.get_str(c)]
#改变当前状态
if(self.state=='in_number'):
#如果当前状态是数字的话,更新目前看到的数字的值
self.ans=self.ans*10+int(c)
elif(self.state=='signed'):
if(c=='+'):
self.sign=1
elif(c=='-'):
self.sign=-1
#不用判断是不是进入了end,因为进入了end之后,self.ans和self.sign的数值就不再改变了
#此时如果之前有数字,那么就那个数字保持不变了;如果之前没有数字,那么就是0
class Solution:
def myAtoi(self, s: str) -> int:
automation=Automation()
for c in s:
automation.get_val(c)
ret=automation.sign*automation.ans
if(ret>INT_MAX):
return INT_MAX
elif(ret<INT_MIN):
return INT_MIN
return ret