题目

字符串转换整数 - 图1

解题思路

字符串转换整数 - 图2

代码

  1. class Solution {
  2. public int myAtoi(String str) {
  3. Automaton automaton = new Automaton();
  4. int length = str.length();
  5. for (int i = 0; i < length; ++i) {
  6. automaton.get(str.charAt(i));
  7. }
  8. return (int) (automaton.sign * automaton.ans);
  9. }
  10. }
  11. class Automaton {
  12. public int sign = 1;
  13. public long ans = 0;
  14. private String state = "start";
  15. private Map<String, String[]> table = new HashMap<String, String[]>() {{
  16. put("start", new String[]{"start", "signed", "in_number", "end"});
  17. put("signed", new String[]{"end", "end", "in_number", "end"});
  18. put("in_number", new String[]{"end", "end", "in_number", "end"});
  19. put("end", new String[]{"end", "end", "end", "end"});
  20. }};
  21. public void get(char c) {
  22. state = table.get(state)[get_col(c)];
  23. if ("in_number".equals(state)) {
  24. ans = ans * 10 + c - '0';
  25. ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);
  26. } else if ("signed".equals(state)) {
  27. sign = c == '+' ? 1 : -1;
  28. }
  29. }
  30. private int get_col(char c) {
  31. if (c == ' ') {
  32. return 0;
  33. }
  34. if (c == '+' || c == '-') {
  35. return 1;
  36. }
  37. if (Character.isDigit(c)) {
  38. return 2;
  39. }
  40. return 3;
  41. }
  42. }