leetcode_c++:Valid Number(065)

Validate if a given string is numeric.

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


有限状态机

http://blog.csdn.net/suwei19870312/article/details/12094233

class Solution {
public:
    bool isNumber(string s) {
        enum InputType {
            INVALID, // 0
            SPACE,   // 1
            SIGN,    // 2
            DIGIT,   // 3
            DOT,     // 4
            EXP,     // 5
            NUM      // 6
        };
        const int table[][NUM] = {
            //0, 1, 2, 3, 4, 5
            {-1, 0, 3, 1, 2,-1}, // 0. start
            {-1, 8,-1, 1, 4, 5}, // 1. number before dot
            {-1,-1,-1, 4,-1,-1}, // 2. dot
            {-1,-1,-1, 1, 2,-1}, // 3. sign
            {-1, 8,-1, 4,-1, 5}, // 4. number after dot
            {-1,-1, 6, 7,-1,-1}, // 5. exp
            {-1,-1,-1, 7,-1,-1}, // 6. sign after exp
            {-1, 8,-1, 7,-1,-1}, // 7. number after exp
            {-1, 8,-1,-1,-1,-1}, // 8. valid end
        };

        int state = 0;
        for (auto ch : s) {
            InputType inputType = INVALID;
            if (isspace(ch))
                inputType = SPACE;
            else if (ch == '+' || ch == '-')
                inputType = SIGN;
            else if (isdigit(ch))
                inputType = DIGIT;
            else if (ch == '.')
                inputType = DOT;
            else if (ch == 'e' || ch == 'E')
                inputType = EXP;

            state = table[state][inputType];
            if (state == -1)
                return false;
        }
        return table[state][SPACE] == 8; // state 8 is valid end
    }
};

strtod函数

http://c.biancheng.net/cpp/html/128.html

class Solution{
public:
    bool isNumber(string s){
        const char *str=s.c_str();
        char* end;
        strtod(str,&end);
        if(end==str)
            return false;
        for(;*end;++end)
            if(!isspace(*end))
                return false;
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值