[LeetCode] Valid Number

来源:互联网 发布:主宰西游装备进阶数据 编辑:程序博客网 时间:2024/05/29 10:36

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.

这道题着实费了不少代码,而且写出来的貌似也不是很好看,这道题AC率10.8%,挺低的了。

1.截取字符串从第一个非空格到倒数第一个非空格的字符串段

2.考虑长度若只为1的情况下的各种情况,“.”,"+","-“均不合理,但是确实可以以这些为开头

3.e是一个很关键的东西,在e之前和在e之后都必须包含有数字,容易忽视的是e后面允许存在一个"+""-"符号!

4.e和小数点都只能有1个,这是比较浅显的了

这道题关键在于题设的不确定性,需要多次修改完备程序,不能纯粹臆想。

class Solution {public:    bool isNumber(const char *s) {        bool pointflag = false;        bool eflag = false;        bool numflag = false;        bool enumflag = false;        bool symbolflag = false;                int startpos = 0;        int endpos = 0;        int length = strlen(s);        int i = 0;        while ( *(s + i) )        {            if (i >= length)            {                return false;            }            if ( *(s + i) != ' ')            {                startpos = i;                break;            }            i++;        }        i = length - 1;         while ( *(s + i))        {            if (i < 0)            {                return false;            }            if ( *(s + i) != ' ')            {                endpos = i;                break;            }            i--;        }                if (endpos < startpos)            return false;        length = endpos - startpos + 1;                if ( !(s[startpos] >= '0' && s[startpos] <= '9' || s[startpos] == '.' || s[startpos] == '+' || s[startpos] == '-'))            return false;        if (length == 1)        {            if (s[startpos] != '.')                return true;            else if (s[startpos] == '+' || s[startpos] == '-')                return false;            else                 return false;        }                if (s[startpos] == '+' || s[startpos] == '-')        {            startpos++;        }                for (int i=startpos; i<=endpos; i++)        {            //a num can not have more than one point            if (s[i] == '.' && pointflag == false)            {                pointflag = true;                continue;            }            if (s[i] == '.' && pointflag == true)                return false;                            //if already have a 'e',the rest part should not have any point            //and e should not have more than one            if (s[i] == 'e' && eflag == false && i != endpos && numflag == true)            {                pointflag = true;                eflag = true;                if (s[i+1] == '+' || s[i+1] == '-')                {                    i++;                }                continue;            }            if (s[i] == 'e' && eflag == false && (i == endpos || numflag == false))            {                return false;            }            if (s[i] == 'e' && eflag == true)                return false;                //normal condition            if ( !(s[i] >= '0' && s[i] <= '9'))                return false;            else if (s[i] >= '0' && s[i] <= '9' && eflag == false)                numflag = true;            else if (s[i] >= '0' && s[i] <= '9' && eflag == true)                enumflag = true;        }        if (eflag == false)        {            if (numflag == true)                return true;        }        else        {            if (enumflag == true && numflag == true)                return true;        }        return false;    }};


0 0
原创粉丝点击