利用状态机来解题
验证给定的字符串是否可以解释为十进制数字。
例如:
“0” => true
" 0.1 " => true
“abc” => false
“1 a” => false
“2e10” => true
" -90e3 " => true
" 1e" => false
“e3” => false
" 6e-1" => true
" 99e2.5 " => false
“53.5e93” => true
" --6 " => false
“-+3” => false
“95a54e53” => false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先列举所有有效数字类型,
第一类,没有指数的整数,分为下面两种:
序号 | 类型 | 举例 |
---|---|---|
1-1 | 整数 | 1 |
1-2 | 正负符号加整数 | +1,-1 |
第二类,没有指数的小数,分为下面六种
序号 | 类型 | 举例 |
---|---|---|
2-1 | 普通小数 | 1.1 |
2-2 | 小数点后面没有数字 | 1. |
2-3 | 小数点前面没有数字 | .1 |
2-4 | 正负符号加普通小数 | -1.1 |
2-5 | 正负符号加小数点后面没有数字 | -1. |
2-6 | 正负符号加小数点前面没有数字 | -.1 |
第三类,带指数的数字,分为下面两种
序号 | 类型 | 举例 |
---|---|---|
3-1 | 整数/小数e整数 | 1.1e100 |
3-2 | 整数/小数e+/-整数 | 100e-100 |
补充,如果前后有空格,中间的数字有效则认为有效。
代码:
#define STATE_MAX 9
#define CONDITION_MAX 6
bool isNumber(char * s){
bool result[STATE_MAX] = {false, false, false, true, false, true, true, false, true};
int tran[STATE_MAX][CONDITION_MAX] = \
{{0, 1, 6, 2, -1, -1},\
{-1, -1, 6, 2, -1, -1},\
{-1, -1, 3, -1, -1, -1},\
{8, -1, 3, -1, 4, -1},\
{-1, 7, 5, -1, -1, -1},\
{8, -1, 5, -1, -1, -1},\
{8, -1, 6, 3, 4, -1},\
{-1, -1, 5, -1, -1, -1},\
{8, -1, -1, -1, -1, -1},};
int i = 0;
int state = 0;
while (s[i] != '\0') {
switch (s[i]) {
case ' ':
state = tran[state][0];
break;
case '+':
case '-':
state = tran[state][1];
break;
case '.':
state = tran[state][3];
break;
case 'e':
state = tran[state][4];
break;
default:
if (s[i] >= '0' && s[i] <= '9') {
state = tran[state][2];
} else {
state = -1;
}
}
if (state == -1) {
return false;
}
i++;
}
return result[state];
}