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

最近重刷leetcode才发现以前代码写的稀烂,这道字符串转整数,以前写的代码纯属硬堆出来的,冗长杂乱,逻辑也很难看懂。看了官方题解,用自动机重新做一遍。

自动机第一步:确定输入和状态转换关系,画出一图一表

对于该题,可能的输入共有以下几种:

  • sign:加减号
  • number:数字,0-9
  • space:空格 ‘ ’
  • other:字母或者其他非法字符
    状态有以下几种,直接给出状态之间的转化关系:

然后绘制状态转换表:

代码中的关键点在注释中
(先贴代码,有空补完)

class autoM {//自动机
public:
    //关键点:get()函数根据输入的c转移状态机的状态
    void get(char c) {
        state = _state_table[state][get_col(c)];
        if (state == "in_number") {
            _ans = _ans * 10 + c - '0';
            _ans = _sign == 1 ? min(_ans, (long long)INT_MAX) : min(_ans, -(long long)INT_MIN);
        }
        else if (state == "in_sign")
            _sign = c == '+' ? 1 : -1;
    }
    int get_ans() {
        return _sign * _ans;
    }
private:
    //关键点2:判断输入的字符对应表中第几列,提供给状态转移函数使用
    int get_col(char c) {
        if (isspace(c)) return 0;
        if (c == '+' or c == '-') return 1;
        if (isdigit(c)) return 2;
        return 3;
    }
    //关键点3:状态转换表
    unordered_map> _state_table = {
        {"start", {"start", "in_sign", "in_number", "end"}},
        {"in_sign", {"end", "end", "in_number", "end"}},
        {"in_number", {"end", "end", "in_number", "end" }},
        {"end", {"end", "end", "end", "end"}}
    };
    int _sign = 1;
    long long _ans = 0;
    std::string state = "start";//状态,初始化为start
};
class Solution {
public:
    int myAtoi(string str) {
        autoM a;
        for(int i = 0; i < str.size(); ++i) {
            a.get(str[i]);
        }
        return a.get_ans();
    }
};

参考:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/zi-fu-chuan-zhuan-huan-zheng-shu-atoi-by-leetcode-/

你可能感兴趣的:(leetcode#8.字符串转换整数 (atoi))