Valid Number

来源:互联网 发布:js遍历div下的a标签 编辑:程序博客网 时间:2024/05/16 10:59

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.

这个题目很纠结@很多难以想到的构造竟然是对的。难度不小@

此题最好边试边发现一些bug!再改!

注意:

1、前面空格,后空格,中间空格

2、加减号(e后面也能出现)

3、e,E 出现的处理

4、点号,能出现的位置。(e   后面不能出现!)

思路:

1、先处理前半部分空格

2、再处理符号(+,-)

3、之后边检查是否中间有空格,过滤末尾空格

4、是否是数,如果是数part为真方便后面处理!

5、对于e或者E的结合,只能出现一次,且在前面为数字的情况才能进行,part设为假。(如果后面有符号就处理掉,即向前走一步)

6、对于点号。首先是判断是否出现过.或e,没有的话继续。

 bool isNumber(const char *s) {                //".e1"错误,40.e3正确,8e错误                bool store_eflag = false;        bool store_dotflag = false;        bool num_flag = false;        bool space_flag = false;        bool part = false;//表示前面部分正确标志                while(*s != '\0'&&*s == ' ')//过滤前面的空格        {            s++;        }                if(*s == '+' || *s == '-')        {            s++;        }                while(*s != '\0')        {            if(*s == ' ')            {                space_flag = true;            }            else if(space_flag)//中间出现过空格            {                return false;            }            else if(*s == '.')            {                if(!store_dotflag &&!store_eflag )//未出现过.和e                {                    store_dotflag = true;                }                else                 return false;            }            else if(isdigit(*s))            {                part = true;                num_flag = true;            }            else if(*s == 'e'||*s == 'E')            {                if(store_eflag != true&&part == true)                {                    if(*(s+1) == '-'||*(s+1) == '+')                    {                        s++;                    }                                        store_eflag = true;                    part = false;//此处设为假判断后续是否会来数字!                }                else return false;            }            else            {                return false;            }                        s++;        }                return part;    }


下面是本人测试的错误!

Input: "+.8"  所以 .8 也是对的!
Output: false
Expected: true

8e 错误
8e2 对

Input: "e9"
Output: true
Expected: false


第二次:

对于数字,必须出现,否则怎么能叫数字呢?!part_flag 用于表示只是一部分,还需数字。

对于开始-- 处理空格,处理+-号。

再者中间空格,此处的中间空格处理很巧妙!!

对于逗号,保证出现前,必须未出现e,且第一次出现。

对于e,比较复杂,保证第一次出现,且出现时保证前面有数字

其他为假!

bool isNumber(const char *s)    {    bool dot_flag = false;    bool e_exit = false;    bool part_flag  = true;               bool space_flag = false;             while(*s == ' ')    {        part_flag = true;    ++s;    }    if(*s == '+'||*s == '-')    {        part_flag = true;    ++s;    }        while(*s != '\0')    {        if(*s == ' ')        {            space_flag = true;            ++s;        }        else if(space_flag)//中间空格!!    {    return false;    }    else if(*s == '.' && !dot_flag)//点号出现必须未出现,且在e之前,    {    if(!e_exit)//未出现过e    {        dot_flag = true;    ++s;    }    else    {    return  false;    }    }    else if((*s == 'e'||*s == 'E') && !e_exit &&(!part_flag))//e 未出现,而且还需确保后面有数字,以及处理正负号(e9 也不行)    {    ++s;    if(*s == '+'||*s == '-')    {    ++s;    }    part_flag = true;//必须有数字出现才完整    e_exit = true;    }    else if(*s >= '0' && *s <= '9' )    {    part_flag = false;//必须有数字         ++s;    }    else    {    return false;    }    }    return !part_flag;    }




0 0
原创粉丝点击