使用自动机方法来解决这种,复杂的流程以及条件情况,的题目是优解,相比较于多重嵌套的(if-else)代码是极大了减小了编程难度和代码量
另外需要注意的是整型的范围大小,当遇到有可能超出2的32次幂的数字时,可能越界的数字 要用longlong(8个字节)来表示
class Automaton {
string state = "start"; //设置初始的状态
unordered_map<string, vector<string>> table = { //用unordered_map嵌套<vector>定义状态转移表
{"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) { //读入char c
if (isspace(c)) return 0; /*isspace()函数,用于判断字符是否是空格类字符,包括:
' ' 0x20 空格 (SPC)
'\t' 0x09 水平制表符 (TAB)
'\n' 0x0a 换行符 (LF)
'\v' 0x0b 垂直制表符 (VT)
'\f' 0x0c 换页 (FF)
'\r' 0x0d 回车 (CR)
*/
if (c == '+' or c == '-') return 1;
if (isdigit(c)) return 2; /*isdigit()函数,用于判断功能:如果参数是0到9之间的数字字符,函数返回非零值,否则返回零值。
注意:判断的字符是char类型的。*/
return 3;
}
public:
int sign = 1;
long long ans = 0;//这里没搞懂为什么一定要用longlong
void get(char c) {
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 == "signed")
sign = c == '+' ? 1 : -1;
}
};
class Solution {
public:
int myAtoi(string str) {
Automaton automaton;
for (char c : str) //猜测:这里“:”的用法表示对于str中的每一个char c,类似于python中的for in 用法
automaton.get(c);
return automaton.sign * automaton.ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/zi-fu-chuan-zhuan-huan-zheng-shu-atoi-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。