leetcode 每日一题 8. 字符串转换整数 (atoi)

DFA法

思路:

DFA即Deterministic Finite Automaton,也就是确定的有穷自动机,通过当前状态和要发生的事务获取到下一个状态。

 

在本题中,我们可以发现在遍历字符串字符时,可能出现的4种类型:① 空格 ② 正负号 ③ 数字 ④ 无效字符 。初始化一个当前状态,在处理每种类型字符时,更新当前状态,直到状态为截止退出。当前状态在遇到每一种类型字符对应更新的状态如下:



根据当前状态,做出对应处理:

start:不做任何操作,继续遍历下一个

signed:记录符号,继续遍历下一个

in_number:记录数字,继续遍历下一个

end:截止退出

这里要注意的是,在返回结果时要根据题目中要求的取值范围做相应处理

代码:

INT_MAX = 2 ** 31 - 1
INT_MIN = -2 ** 31

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.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 = self.ans * 10 + 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: str) -> int:
        automaton = Automaton()
        for c in str:
            automaton.get(c)
            if automaton.state == "end":
                break
        return automaton.sign * automaton.ans

 

 

猜你喜欢

转载自www.cnblogs.com/nilhxzcode/p/12744768.html