【leetcode】8. 字符串转换整数 (atoi)
方法一
INT_MAX, INT_MIN = 2 ** 31 - 1, -2 ** 31
class Solution():
def myAtoi(self, s):
s_list = s.split()
if not s_list:
return 0
s_list_first = s_list[0]
y = 0
x = 0
length = len(s_list_first)
if s_list_first[0] == '-':
sign = -1
x += 1
elif s_list_first[0] == '+':
sign = 1
x += 1
elif s_list_first[0].isdigit():
sign = 1
else:
return 0
while x < length:
if not s_list_first[x].isdigit():
return y * sign
y = 10 * y + int(s_list_first[x])
y = min(y, INT_MAX) if sign == 1 else min(y, -INT_MIN)
x += 1
return y * sign
DFA算法(有穷自动机)
INT_MAX, INT_MIN = 2 ** 31 - 1, -2 ** 31
class Automaton:
def __init__(self):
self.state = 'start'
self.ans = 0
self.sign = 1
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.isspace():
return 0
if c == '+' or c == '-':
return 1
if c.isdigit():
return 2
return 3
def get(self, c):
self.state = self.table[self.state][self.get_col(c)]
if self.state == 'in_number':
self.ans = 10 * self.ans + int(c)
self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN)
elif self.state == 'signed':
self.sign = 1 if c == '+' else -1
class Solution():
def myAtoi(self, str):
automaton = Automaton()
for c in str:
automaton.get(c)
return automaton.sign * automaton.ans
总结
1、本题重点学习DFA算法,通过“有穷自动机”避免了冗杂的情况,使代码整体逻辑性更强。
我们也可以用下面的表格来表示这个自动机:
2、一般方法详见方法一。
3、判断字符是否为空格:
str.isspace()
判断字符是否为数字:
str.isdigit()