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.

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

此题最好边试边发现一些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;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值