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

文章介绍了如何使用有限状态自动机处理不同类型的输入,特别是涉及到字符串到整数的转换。在转换过程中,关键在于避免复杂的枚举和处理溢出边界条件。提供的代码示例展示了如何构建和应用自动机来简化问题,同时检查了负数、正数和非数字字符的情况。
摘要由CSDN通过智能技术生成

 题目链接:力扣

 这题并不复杂,但是根据不同类型的输入会进行不同的操作,因此关键是有限状态自动机的应用。如果直接枚举出所有的情况,代码会非常复杂。此外这题还需要考虑溢出的边界情况。

本题的自动机如下:

//             ' '         '+/-'       0~9            others
// start      start       signed      in_number        end
// signed     end          end         in_number       end 
// in_number   end         end         in_number       end
// end         end         end         end             end

 代码如下,其实想到自动机以后代码就非常简单:

class Solution {
public:
    int myAtoi(string s) {
        unordered_map<string,vector<string>> state={
            {"start",{"start","signed","in_number","end"}},
            {"signed",{"end","end","in_number","end"}},
            {"in_number",{"end","end","in_number","end"}},
            {"end",{"end","end","end","end"}}
        };
        string st="start";
        long long res=0;
        bool is_negative=false;
        for(int i=0;i<s.size();i++){
            if(st=="end"){
                break;
            }
            char c=s[i];
            if(c==' '){
                st=state[st][0];
            } 
            else if (c=='+' || c=='-'){
                st=state[st][1];
                if(st=="end") break;
                if(c=='-') is_negative=true;
            }else if (c>='0'&& c<='9'){
                st=state[st][2];
                res=res*10+c-'0';
                if(!is_negative && res>INT_MAX) return INT_MAX;
                else if(is_negative && -res<INT_MIN) return INT_MIN;
            }else{
                st=state[st][3];
            }
        }
        if(is_negative){
            res=-res;
            return (int)res;
        }
        return (int)res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值