文巾解题 8. 字符串转换整数 (atoi)
生活随笔
收集整理的這篇文章主要介紹了
文巾解题 8. 字符串转换整数 (atoi)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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#首位是正負號,第二位不是數(shù)字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])#負數(shù)的情況elif(s[0]=='+'):i=1while(i<len(s)):if(s[i]>='0' and s[i]<='9'):i+=1else:break ret=int(s[1:i])#正數(shù)的情況else:i=0while(i<len(s)):if(s[i]>='0' and s[i]<='9'):i+=1else:break ret=int(s[0:i])#“無符號”數(shù)的情況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)#截取結(jié)果2.2 自動機
我們的程序在每個時刻有一個狀態(tài) s。每次從序列中輸入一個字符 c,并根據(jù)字符 c 轉(zhuǎn)移到下一個狀態(tài) s'。
這樣,我們只需要建立一個覆蓋所有情況的從 s 與 c 映射到 s' 的表格,即可解決題目中的問題。
接下來編程部分就非常簡單了:我們只需要把上面這幾個狀態(tài)的狀態(tài)轉(zhuǎn)換表抄進代碼即可。
INT_MAX = 2 ** 31 - 1 INT_MIN = -2 ** 31 #定義上下界#以下是自動機的部分: class Automation:def __init__(self):self.state='start'self.sign=1self.ans=0 #最終要返回的數(shù)字#初始化自動機,初始狀態(tài)為'start',一開始默認為正數(shù),結(jié)果為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']}#定義狀態(tài)轉(zhuǎn)化規(guī)則,當前狀態(tài),見到不同的字符時,會進入不同的東西def get_str(self,c):#讀入一個字符,判斷它是空格,還是正負號,還是數(shù)字,還是其他#這個對之后自動機狀態(tài)轉(zhuǎn)換是有幫助的if(c==' '):return 0elif(c=='+' or c=='-'):return 1elif('0'<=c<='9'):return 2else:return 3#return的數(shù)值和上面table每行的下標的一一對應的def get_val(self,c):#讀入一個字符,對其進行相應的狀態(tài)轉(zhuǎn)化合數(shù)值更新self.state=self.table[self.state][self.get_str(c)]#改變當前狀態(tài)if(self.state=='in_number'):#如果當前狀態(tài)是數(shù)字的話,更新目前看到的數(shù)字的值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的數(shù)值就不再改變了 #此時如果之前有數(shù)字,那么就那個數(shù)字保持不變了;如果之前沒有數(shù)字,那么就是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?
總結(jié)
以上是生活随笔為你收集整理的文巾解题 8. 字符串转换整数 (atoi)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 7. 整数反转
- 下一篇: 文巾解题 10. 正则表达式匹配