Valid Number 题解

题目来源: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.

解题思路:

粗暴方法

自己写的代码丑陋无比,一种情况一种情况试, 实在是无参考价值。 主要是各种情况,例如:

input

result

.123

true

12.

True

47e+6

True

__1.__

True

.

False

46.e3

OJ里的 .2e81 true 0.e false 46.e3 true

+3

True

-.3

True

6e6.5

false

    bool isNumber(const char *s)
    {
        if(s == NULL) return false;
        if(*s == '\0') return false;
        while(*s == ' ')
            s++; //skip 空格
        if(*s == '\0') return false;
        if(*s == '-' || *s == '+') s++;
        bool firstnumber = false;
        if((*s >= '0' && *s <= '9') || *s == '.')
            firstnumber = true;
        if(! firstnumber) return false;
        bool has_e_before = false;
        bool has_dot_before = *s == '.';
        if(has_dot_before)
        {
            s++;
            if (!(*s >= '0' && *s <= '9')) return false; // "."
        }
        while(*s != '\0')
        {
            if(*s >= '0' && *s <= '9')
            {
                s++;
            }else if(*s == 'e')
            {
                if(has_e_before) return false;//.2e81  true  //0.e false  //46.e3 true
                has_e_before = true;
                s++;
                if(*s == '+' || *s == '-') s++; //005047e+6 ok
                if (!(*s >= '0' && *s <= '9')) return false; //"e." "e 1"
            }else if(*s == ' ')
            {
                while(*s != '\0' && *s == ' ')
                    s++;
                if(*s == '\0')//"  1.2  "
                    return true;
                return false; //" 2.3  3" 
            }else if(*s == '.') 
            { 
                if(has_dot_before || has_e_before) return false; 
                has_dot_before = true; 
                s++; 
            }else 
            { 
                return false; 
            } 
        } 
        return true; 
    }

整理下上面的代码,可以更好看些。

利用strtod.

利用函数strtod.

能够一步一步提取str中能够组成的double, str_end为提取后剩下的串。这里找了一份实现, 有兴趣的可以参考下 strtod的源码.

利用自动机

可参考 自动机实现valid-number.

Last updated

Was this helpful?