【leetcode】Valid Number

13 篇文章 0 订阅
5 篇文章 0 订阅

目前leetcode上AC率最低的一题。第一次实战有限状态机,终于摸到点皮毛了。


输入存在6种情况:

  • 0 无效值 INVALID
  • 1 空白符 SPACE
  • 2 正负号 SIGN
  • 3 小数点 DOT
  • 4 数字 NUMBER
  • 5 指数符 EXPONENT

通过在Custom Testcase输入测试用例,可以看出合法的格式,不一一列出。

状态跳转情况(英文表示该状态可以接受的输入,紧跟的数字表示将会跳转至哪个状态):

  • 状态0:SPACE 0, SIGN 1, DOT 2, NUMBER 3
  • 状态1:DOT 2, NUMBER 3
  • 状态2:NUMBER 4
  • 状态3(合法结束):DOT 4, NUMBER 3, EXPONENT 5, SPACE 8
  • 状态4(合法结束):EXPONENT 5, NUMBER 4, SPACE 8
  • 状态5:SIGN 6, NUMBER 7
  • 状态6:NUMBER 7
  • 状态7(合法结束):NUMBER 7, SPACE 8
  • 状态8(合法结束):SPACE 8

代码使用到状态转移表,行号代表状态,列号代表当前输入情况,元素数值代表即将跳转至的状态。


bool isNumber(char* s) {
    enum InputType
    {
        INVALID,
        SPACE,
        SIGN,
        DOT,
        NUMBER,
        EXPONENT,
        NUM_STATE,
    };
    
    int transTable[][NUM_STATE] = 
    {
        -1,  0,  1,  2,  3, -1,
        -1, -1, -1,  2,  3, -1,
        -1, -1, -1, -1,  4, -1,
        -1,  8, -1,  4,  3,  5,
        -1,  8, -1, -1,  4,  5,
        -1, -1,  6, -1,  7, -1,
        -1, -1, -1, -1,  7, -1,
        -1,  8, -1, -1,  7, -1,
        -1,  8, -1, -1, -1, -1
    };
    
    int state = 0;
    int inputType = 0;
    while (*s != '\0')
    {
        if (isspace(*s))
            inputType = SPACE;
        else if (*s == '+' || *s == '-')
            inputType = SIGN;
        else if (*s == '.')
            inputType = DOT;
        else if (isdigit(*s))
            inputType = NUMBER;
        else if (*s == 'E' || *s == 'e')
            inputType = EXPONENT;
        else
            inputType = INVALID;
        state = transTable[state][inputType];
        if (state == -1)
            return false;
        ++s;
    }
    return state == 3 || state == 4 || state == 7 || state == 8;
}


Reference:https://github.com/fuwutu/LeetCode/blob/master/Valid%20Number.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值