【leetcode】8. 字符串转换整数 (atoi)

【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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值