1. class Solution {
    2. public:
    3. int myAtoi(string str) {
    4. int i = 0, flag = 1;
    5. long res = 0; //默认flag = 1,正数
    6. while (str[i] == ' ') i ++; //若str全为空格,str[i] = '\0'(最后一个i)
    7. if (str[i] == '-') flag = -1;
    8. if (str[i] == '-' || str[i] == '+') i ++;
    9. for (; i < str.size() && isdigit(str[i]); i ++) {
    10. res = res * 10 + (str[i] - '0');
    11. if (res >= INT_MAX && flag == 1) return INT_MAX;
    12. if (res > INT_MAX && flag == -1) return INT_MIN;
    13. }
    14. return flag * res;
    15. }
    16. };

    状态机

    1. class Automaton {
    2. string state = "start";
    3. unordered_map<string, vector<string>> table = {
    4. {"start", {"start", "signed", "in_number", "end"}},
    5. {"signed", {"end", "end", "in_number", "end"}},
    6. {"in_number", {"end", "end", "in_number", "end"}},
    7. {"end", {"end", "end", "end", "end"}}
    8. };
    9. int get_col(char c) {
    10. if (isspace(c)) return 0;
    11. if (c == '+' or c == '-') return 1;
    12. if (isdigit(c)) return 2;
    13. return 3;
    14. }
    15. public:
    16. int sign = 1;
    17. long long ans = 0;
    18. void get(char c) {
    19. state = table[state][get_col(c)];
    20. if (state == "in_number") {
    21. ans = ans * 10 + c - '0';
    22. ans = sign == 1 ? min(ans, (long long)INT_MAX) : min(ans, -(long long)INT_MIN);
    23. }
    24. else if (state == "signed")
    25. sign = c == '+' ? 1 : -1;
    26. }
    27. };
    28. class Solution {
    29. public:
    30. int myAtoi(string str) {
    31. Automaton automaton;
    32. for (char c : str)
    33. automaton.get(c);
    34. return automaton.sign * automaton.ans;
    35. }
    36. };