math---65. 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.

问题解析:

1.此题的意思是:判断给出的一个string代表的数是不是有效的。
2. 要判断首先得知道:数字可能会有正负号、小数点、和指数标志e。有以下几点:
       1. 正负号只能出现在第一个位置或者e的下一个位置,各只能出现一次,并且正负号之后必须有数字。
       2. 小数点只能出现一次,并且在e之前,并且小数点出现时前面必须有数字出现。
       3. e只能出现一次,并且e前面必须有数字出现,而且e之后不能有小数点。
3. 方法就是按照上述的判断规则判断字符串是否满足规格即可。

代码如下:

class Solution {
public:
    bool isNumber(string s) 
    {   
        int size = s.size();
        // 跳过前导空格
	    int i = 0;
	    i = s.find_first_not_of(' ');
	    // 处理正负号
	    if(i>=0 && i<size &&'+' == s[i] || '-' == s[i])
		    ++i;
	    // 处理后面的数字,bHasdight代表之前是否出现数字,bHasPoint代表是否出现‘.’,bHasExp代表是否出现‘e’
        bool bHasdight = false, bHasPoint = false, bHasExp = false;
        for(; i<size; ++i)
        {
            // 处理‘.’,一个‘.’只能出现一次,数字之前可以出现‘.’
            if('.' == s[i] && !bHasPoint)
                bHasPoint = true;
            else if(s[i] >='0' && s[i]<='9')
                bHasdight  =true;
            // 处理出现‘e’的情况,并且‘e’之后只能是数字,而且‘e’之后可以有正负号,不能有‘.’。‘e’出现之前必须出现数字
            else if('e' == s[i] && !bHasExp && bHasdight)
            {
                bHasExp = true;
                bHasPoint = true;
                ++i;
                if(i <size && '+'==s[i] || '-'==s[i])
                {
                    if(i+1<=size && s[i+1]>='0' && s[i+1]<='9')
                        ++i;
                    else
                        return false;
                }
                else if(i>=size ||s[i]<'0' || s[i]>'9')
                    return false;
            }
            else
                break;
        }
        // 跳过数字后面的空格
        while(i<size && s[i]== ' ')
            ++i;
              
	    return bHasdight && i == size;
    }
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值