码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode]valid number

时间:2015-10-19 12:12:01      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

描述:

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.

分析:

1.有限自动机

2.strtod

code1:

bool isNumber(const char *s)
    {
        enum InputType
        {
            INVALID, // 0
            SPACE, // 1 空格
            SIGN, // 2 正负号
            DIGIT, // 3  数字
            DOT, // 4  点号
            EXPONENT, // 5  指数
            NUM_INPUTS // 6
        };
        const int transitionTable[][NUM_INPUTS] =
        {
            -1, 0, 3, 1, 2, -1, // next states for state 0
            -1, 8, -1, 1, 4, 5, // next states for state 1
            -1, -1, -1, 4, -1, -1, // next states for state 2
            -1, -1, -1, 1, 2, -1, // next states for state 3
            -1, 8, -1, 4, -1, 5, // next states for state 4
            -1, -1, 6, 7, -1, -1, // next states for state 5
            -1, -1, -1, 7, -1, -1, // next states for state 6
            -1, 8, -1, 7, -1, -1, // next states for state 7
            -1, 8, -1, -1, -1, -1, // next states for state 8
        };
        int state = 0;
        for (; *s != ‘\0‘; ++s)
        {
            InputType inputType = INVALID;
            if (isspace(*s))
                inputType = SPACE;
            else if (*s == ‘+‘ || *s == ‘-‘)
                inputType = SIGN;
            else if (isdigit(*s))
                inputType = DIGIT;
            else if (*s == ‘.‘)
                inputType = DOT;
            else if (*s == ‘e‘ || *s == ‘E‘)
                inputType = EXPONENT;
            // Get next state from current state and input symbol
            state = transitionTable[state][inputType];
            // Invalid input
            if (state == -1) return false;
        }
        // If the current state belongs to one of the accepting (final) states,
        // then the number is valid
        return state == 1 || state == 4 || state == 7 || state == 8;
    }

code2:

/*valid number,使用 strtod库函数*/
    bool isNumber_strtod(string s)
    {
        const char *cstr = s.c_str();
        char *endptr;
        strtod(cstr, &endptr);
        if (endptr == cstr) return false;
        for (;*endptr;++endptr)
        if (!isspace(*endptr)) return false;
        return true;
    }

[leetcode]valid number

标签:

原文地址:http://www.cnblogs.com/panweishadow/p/4854944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!