字符串转换整数 Atoi

  1. class Solution {
  2. public:
  3. int myAtoi(string str) {
  4. int res = 0;
  5. int i = 0;
  6. int flag = 1;
  7. while(str[i] == '') {
  8. i++;
  9. }
  10. if(str[i] == '-') {
  11. flag = -1;
  12. }
  13. if(str[i] == '+' || str[i] == '-') {
  14. i++;
  15. }
  16. while(i < str.size() && isdigit(str[i])) {
  17. int r = str[i] - '0';
  18. if(res > INT_MAX / 10 || (res == INT_MAX / 10 && r > 7)) {
  19. return flag > 0 ? INT_MAX : INT_MIN;
  20. }
  21. res = res * 10 + r;
  22. i++;
  23. }
  24. return flag > 0 ? res : -res;
  25. }
  26. };

自动机

fig1.png

  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. };