剑指 Offer 20. 表示数值的字符串

题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

这一题首先确定所有的合法和不合法情况(有点奇怪的是".1"或者"1."这种也算数字,我直接疑惑)

比如e之后不能有加号和减号,.之后不能有.

把基本的状态都考虑一下,画一个状态装换图,就出来了。

这块是引用了大佬的图,因为我自己画的手稿已经不能看了

大佬力扣链接

剑指 Offer 20. 表示数值的字符串_第1张图片

剑指 Offer 20. 表示数值的字符串_第2张图片

将其翻译为代码即可。将第二张图变为一个二维数组(我和大佬的不一样,所以二维数组不一样)。

class Solution {
    private int make(char c) {
        switch (c) {
            case ' ':
                return 0;
            case '+':
            case '-':
                return 1;
            case '.':
                return 3;
            case 'e':
                return 4;
            default:
                if ((c >= 48) && (c <= 60)) {
                    return 2;
                }
        }

        return -1;
    }

    public boolean isNumber(String s) {
        int[][] states = new int[][]{
                {0, 1, 2,8,-1},
                {-1, -1, 2, 8, -1},
                {7,-1,2,3,4},
                {7,-1,3,-1,4},
                {-1,5,6,-1,-1},
                {-1,-1,6,-1,-1},
                {7,-1,6,-1,-1},
                {7,-1,-1,-1,-1},
                {-1,-1,3,-1,-1},
        };

        char[] arr = s.toCharArray();
        int i = 0;

        for (char c : arr) {
            int index = make(c);
            if (index == -1) {
                return false;
            }

            i = states[i][index];
            if (i == -1) {
                return false;
            }
        }

        int finalI = 0b1010;
        return (finalI & i) == 2;
        // int[] res = {2, 3, 6, 7};
        // return Arrays.stream(res).anyMatch(n -> n == finalI);
    }
}

:由于我和图里的状态序号不同,可能不一致。

所以还请以自己的代码为准。

:最后的finalI是根据res决定的。如果觉得二进制不好理解,就理解为只要最终的状态是[2367]中的一个,就是合格的状态。

你可能感兴趣的:(剑指offer)