最近重刷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-/