Valid Number

题意:判断一个字符串是否是有效的数字
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
思路:使用有限状态自动机的方式,分成三种情况处理。这里的测试用例“.1"=>true。
代码:
class Solution {
//finite state machine 
//status 1 => 小数点前面的部分 
//status 2 => 小数点后到'e'前面的部分 
//status 3 => e后面的科学计数法部分 
//should practice couple times more 
public: 
    bool isNumber(const char *s) { 
        // Start typing your C/C++ solution below 
        // DO NOT write int main() function 
        bool bIntNum = false; 
        int nCurState = 1; 
        while (true) 
        { 
            if (nCurState == 1) 
            { 
                while (*s == ' ') 
                    s++; 
                if (*s == '+' || *s == '-') 
                    s++; 
                if (*s >= '0' && *s <= '9') 
                { 
                    while (*s >= '0' && *s <= '9') 
                        s++; 
                    bIntNum = true; 
                } 

                if (*s == '.' /*&& bIntNum*/) //.34 true 
                { 
                    nCurState = 2; 
                    s++; 
                    continue; 
                } 
                else if (*s == 'e' && bIntNum)//go to state 3, there must have bIntNum before 
                { 
                    nCurState = 3; 
                    s++; 
                    continue; 
                } 
            } 
            else if (nCurState == 2)//1. true 
            { 
                //bIntNum = false; 
                if (*s >= '0' && *s <= '9') 
                { 
                    while (*s >= '0' && *s <= '9') 
                        s++; 
                    bIntNum = true; 
                } 
                if (*s == 'e' && bIntNum)//go to state 3, there must have bIntNum before 
                { 
                    nCurState = 3; 
                    s++; 
                    continue; 
                } 
            } 
            else//nCurState 3 need judge if there is bIntNum again, because "1e" is illegal 
            { 
                bIntNum = false; 
                if (*s == '+' || *s == '-') 
                    s++; 
                if (*s >= '0' && *s <= '9') 
                { 
                    while (*s >= '0' && *s <= '9') 
                        s++; 
                    bIntNum = true; 
                } 
            } 
while (*s == ' ') 
                 s++; 
        return (bIntNum && *s == 0); 
        } 
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值