leetcode8字符串转换整数atoi

这篇博客介绍了如何利用有限状态机(DFA)解决LeetCode上的第8题——字符串转换整数(atoi)。作者通过建立不同状态之间的转换表,简化了手动处理正负号、数字和其他字符的复杂逻辑。代码中定义了一个DFA结构体,包含了符号、结果和当前状态,并通过映射表实现了状态转换。最终,根据DFA的状态更新结果并返回符号与数值的乘积,从而完成整数解析的过程。
摘要由CSDN通过智能技术生成

leetcode8字符串转换整数atoi

思路:

空格正负号数字其他
startstartsignedin_numberend
signedendendin_numberend
in_numberendendin_numberend
endendendendend

上表就是此题的逻辑,左侧是初始状态,右侧是遇到一个字符之后的状态。
有了这个表,思考一会稍加尝试之后发现,手写逻辑过于复杂,所以选择自动机来解决这个题目。
只需要对于字符串中的每个字符都进行一次状态转换,对于in_number状态,进行一次答案更新(需要注意的是,如果爆int,应该更新为INT_MAX或者INT_MIN)对于signed状态进行符号更新,最后返回符号和数值的积即可。

代码:

struct DFA
{
    int sign = 1;
    long long res = 0;
    string state = "start";
    unordered_map<string, vector<string>> 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"}}
    };
    int get_c(char c)
    {
        if (c == ' ') return 0;
        if (c == '+' || c == '-') return 1;
        if (c >= '0' && c <= '9') return 2;
        return 3; 
    }
    void dfa_get(char c)
    {
        state = table[state][get_c(c)];
        if (state == "in_number")
        {
            res = res * 10LL + (c - '0');
            res = sign == 1 ? min(res, (long long)INT_MAX) : min(res, -(long long)INT_MIN);
        }
        else if (state == "signed")
        {
            sign = c == '+' ? 1 : -1;
        }
    }
};

class Solution {
public:
    int myAtoi(string s) {
        DFA dfa;
        for (char c : s)
            dfa.dfa_get(c);
        return dfa.sign * dfa.res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值