初级算法-字符串转换整数 (atoi)

初级算法-字符串转换整数 (atoi)_第1张图片
说实话这题让我深深的感觉到了自己写的代码的臃肿,在加了不知多少个判断之后,才通过。

  1. 先献丑,就生判断解法,各种不同情况的判断,仅供娱乐。。
    public int myAtoi(String s) {
        StringBuilder result = new StringBuilder();
        int x = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ' && result.length() == 0 && x == 0) {
            } else if (s.charAt(i) == '+' || s.charAt(i) == '-') {
                if (x != 0 || result.length() != 0) {
                    break;
                } else {
                    x = s.charAt(i) == '+' ? 1 : -1;
                }
            } else if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                result.append(s.charAt(i));
                if (Long.parseLong(result.toString()) > Integer.MAX_VALUE) {
                    return x == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
                }
            } else {
                break;
            }
        }
        if (result.length() == 0) {
            return 0;
        }
        return Integer.parseInt(result.toString()) * (x == 0 ? 1 : x);
    }
  1. 再记录一下官方的解法,官方引入了一个概念,叫自动机,也可以叫有限状态机,是离散数学里的一个集合构建的离散结构,用于计算机器建模,可以是产品经理理业务逻辑用的,也可以是测试用的测试用例,有限状态机示例。
    初级算法-字符串转换整数 (atoi)_第2张图片
    实际在业务逻辑相对复杂的开发中,也可以列一个这么个表,这样,首先代码不会过于臃肿,其次业务场景也不会有什么遗漏,毕竟你开发完了再自己测怎么都觉得没啥大问题。。。
    回到本题,通过题目,可以列出4个状态:初始状态,有正负标记,添加数值中,完成;而针对传入的字符串的字符,也可分为4类:空格,正负标记,数字,其他字符。
    那么可以列出下面有限状态机和表格(官方的,以后回来省得翻)
    初级算法-字符串转换整数 (atoi)_第3张图片

初级算法-字符串转换整数 (atoi)_第4张图片
再根据这个有限状态机,编写代码,就清晰多了(官方代码)。

public class MyAtoi {
    public int myAtoi(String str) {
        Automaton automaton = new Automaton();
        int length = str.length();
        for (int i = 0; i < length; ++i) {
            automaton.get(str.charAt(i));
        }

        return (int) (automaton.sign * automaton.ans);
    }

}

class Automaton {
    public int sign = 1;
    public long ans = 0;
    private String state = "start";
    private final Map<String, String[]> table = new HashMap<String, String[]>() {{
        put("start", new String[]{"start", "signed", "in_number", "end"});
        put("signed", new String[]{"end", "end", "in_number", "end"});
        put("in_number", new String[]{"end", "end", "in_number", "end"});
        put("end", new String[]{"end", "end", "end", "end"});
    }};

    public void get(char c) {
        state = table.get(state)[getCol(c)];
        if ("in_number".equals(state)) {
            ans = ans * 10 + c - '0';
            ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);
        } else if ("signed".equals(state)) {
            sign = c == '+' ? 1 : -1;
        }
    }

    private int getCol(char c) {
        if (c == ' ') {
            return 0;
        }
        if (c == '+' || c == '-') {
            return 1;
        }
        if (Character.isDigit(c)) {
            return 2;
        }
        return 3;
    }
}

你可能感兴趣的:(#,初级算法,算法,java)