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

本文主要介绍了如何利用DFA(有穷自动机)算法解决LeetCode中的8题——字符串转换整数(atoi)。文中详细展示了两种方法,一是传统的遍历解析,二是利用DFA简化代码逻辑。DFA自动机通过状态转移表,高效地处理了正负号、数字以及非法字符的情况,提高了代码的可读性。此外,还提供了关键代码片段以及对自动机状态转移的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值