class Solution {public:int myAtoi(string str) {int i = 0, flag = 1;long res = 0; //默认flag = 1,正数while (str[i] == ' ') i ++; //若str全为空格,str[i] = '\0'(最后一个i)if (str[i] == '-') flag = -1;if (str[i] == '-' || str[i] == '+') i ++;for (; i < str.size() && isdigit(str[i]); i ++) {res = res * 10 + (str[i] - '0');if (res >= INT_MAX && flag == 1) return INT_MAX;if (res > INT_MAX && flag == -1) return INT_MIN;}return flag * res;}};
状态机
class Automaton {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;if (c == '+' or c == '-') return 1;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 == "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)automaton.get(c);return automaton.sign * automaton.ans;}};
