LeetCode二刷记录【2】

本文记录了LeetCode中的字符串转换整数问题的解决方案,采用自动状态机的方法,并介绍了如何利用ctype.h库中的函数来实现。

字符串转换整数 (atoi)

自动状态机解法。

像题目要求的这种可以根据输入明确画出状态变化的情况可以考虑建立一个自动状态机。

class Automation{
  private:
    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_col(char c)
    {
        if(isspace(c)) 
            return 0;
        else if(c=='+'||c=='-')
            return 1;
        else if(isdigit(c))
            return 2;
        
        return 3;
    }
    
 public:
    int sign=1;
    long long ans=0;
    void get(char c)
    {
        state=table[state][get_col(c)];
        if(state=="signed")
        {
            if(c=='-')
                sign=-1;
        }
        else if(state=="in_number")
        {
            ans=ans*10+c-'0';
            ans=sign==1?min(ans,(long long)INT_MAX):min(ans,-(long long)INT_MIN);
        }
    }
    
};

class Solution {
public:
    int myAtoi(string str) {
        Automation A;
        for(auto ch:str)
            A.get(ch);
        
        return A.sign*A.ans;
    }
};

另外用到了ctype.h中的两个函数:

_Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int __cdecl isspace(_In_ int _C);

_Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int __cdecl isdigit(_In_ int _C);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值