[LeetCode] 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.

这道题着实费了不少代码,而且写出来的貌似也不是很好看,这道题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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值