文巾解题 8. 字符串转换整数 (atoi)
生活随笔
收集整理的这篇文章主要介绍了
文巾解题 8. 字符串转换整数 (atoi)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1 题目描述
2 解题思路
2.1 笨办法
class Solution:def myAtoi(self, s: str) -> int:s=s.strip()#去掉前面的空格if(s==''):return 0#如果全是空格,返回0if(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=1while(i<len(s)):if(s[i]>='0' and s[i]<='9'):i+=1else:break ret=-1*int(s[1:i])#负数的情况elif(s[0]=='+'):i=1while(i<len(s)):if(s[i]>='0' and s[i]<='9'):i+=1else:break ret=int(s[1:i])#正数的情况else:i=0while(i<len(s)):if(s[i]>='0' and s[i]<='9'):i+=1else:break ret=int(s[0:i])#“无符号”数的情况if(-1*pow(2,31)<=ret<=pow(2,31)-1):return retelif(ret>pow(2,31)-1):return pow(2,31)-1else: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=1self.ans=0 #最终要返回的数字#初始化自动机,初始状态为'start',一开始默认为正数,结果为0self.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 0elif(c=='+' or c=='-'):return 1elif('0'<=c<='9'):return 2else: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=1elif(c=='-'):self.sign=-1 #不用判断是不是进入了end,因为进入了end之后,self.ans和self.sign的数值就不再改变了 #此时如果之前有数字,那么就那个数字保持不变了;如果之前没有数字,那么就是0class Solution:def myAtoi(self, s: str) -> int:automation=Automation()for c in s:automation.get_val(c)ret=automation.sign*automation.ansif(ret>INT_MAX):return INT_MAXelif(ret<INT_MIN):return INT_MINreturn ret
总结
以上是生活随笔为你收集整理的文巾解题 8. 字符串转换整数 (atoi)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 文巾解题 7. 整数反转
- 下一篇: 文巾解题 10. 正则表达式匹配