leetcode 66.Valid Number

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button  to reset your code definition.

[Solution]

状态转移图

    enum InputType 
    {
        INVALID,        // 0 Include: Alphas, '(', '&' ans so on
        SPACE,        // 1
        SIGN,        // 2 '+','-'
        DIGIT,        // 3 numbers
        DOT,            // 4 '.'
        EXPONENT,        // 5 'e' 'E'
    };
    int transTable[9][6] = 
    {
        //0INVA,1SPA,2SIG,3DI,4DO,5E
        {-1,  0,  3,  1,  2, -1,},   //0初始无输入或者只有space的状态
        {-1,  8, -1,  1,  4,  5,},  //1输入了数字之后的状态
        {-1, -1, -1,  4, -1, -1,},  //2前面无数字,只输入了Dot的状态
        {-1, -1, -1,  1,  2, -1,},  //3输入了符号状态
        {-1,  8, -1,  4, -1,  5,},  //4前面有数字和有dot的状态
        {-1, -1,  6,  7, -1, -1,},  //5'e' or 'E'输入后的状态
        {-1, -1, -1,  7, -1, -1,},  //6输入e之后输入Sign的状态
        {-1,  8, -1,  7, -1, -1,},  //7输入e后输入数字的状态
        {-1,  8, -1, -1, -1, -1,},  //8前面有有效数输入之后,输入space的状态
    };
    bool isNumber(string s) 
    {
        int state = 0, i = 0;
        while (s[i])
        {
            InputType input = INVALID;
            if (s[i] == ' ') 
                input = SPACE;
            else if (s[i] == '+' || s[i] == '-') 
                input = SIGN;
            else if (isdigit(s[i])) 
                input = DIGIT;
            else if (s[i] == '.') 
                input = DOT;
            else if (s[i] == 'e' || s[i] == 'E') 
                input = EXPONENT;
                
            state = transTable[state][input];
            if (state == -1) 
                return false;
            i++;
        }
        return (state == 1 || state == 4 || state == 7 || state == 8);
    }

 

转载于:https://www.cnblogs.com/ym65536/p/4320612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值