题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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之后不能有加号和减号,.
之后不能有.
。
把基本的状态都考虑一下,画一个状态装换图,就出来了。
这块是引用了大佬的图,因为我自己画的手稿已经不能看了
将其翻译为代码即可。将第二张图变为一个二维数组(我和大佬的不一样,所以二维数组不一样)。
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]中的一个,就是合格的状态。