LeetCode解题方法9-状态机

1.题目

  1. 有效数字

2.说明

利用状态机来解题

3.题目65解析

题目:

验证给定的字符串是否可以解释为十进制数字。

例如:

“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

补充,如果前后有空格,中间的数字有效则认为有效。

上述的所有可能用状态机表示如下:
LeetCode解题方法9-状态机_第1张图片

代码:

#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];
}

你可能感兴趣的:(LeetCode解题方法9-状态机)