面试题20. 表示数值的字符串

面试题20. 表示数值的字符串

Scroll Down

表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"、"-1E-16"及"12e+5.4"都不是。

思路

感觉判断很复杂,没想出来怎么判断。看到一篇解答很好!~

看了题解,其实应该用自动机来写,但是不会

解答

class Solution {
    public boolean isNumber(String s) {
        if (s == null || s.length() == 0) return false;

        char[] array = s.trim().toCharArray();
        // 这些布尔值分别表示 数字类型出现过、小数点出现过、指数出现过
        boolean num = false, dot = false, e = false;
        for (int i = 0; i < array.length; i++) {
            if (array[i] >= '0' && array[i] <= '9') {
                num = true;
            } else if (array[i] == '.') {
                // 如果指数后面出现小数点则错误
                if (e || dot) return false;
                dot = true;
            } else if (array[i] == 'e' || array[i] == 'E') {
                // 如果指数前面没出现数字则错误
                if (!num || e) return false;
                e = true;
                num = false;
            } else if (array[i] == '-' || array[i] == '+') {
                // 如果出现符号的位置不是第一位,并且符号的前一位不是指数则错误
                if (i != 0 && array[i - 1] != 'e' && array[i - 1] != 'E') return false;
            } else return false;
        }
        return num;
    }
}