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.

 

判断一个字符串是否是数字。

注意点:

1、数字可以是常规表示或者科学计数两种。

2、指数项只能为整数。

3、前后可以有空格,但是中间不能有空格。

4、“.1” "1."这类的表示也算是合法的……不过小数点前后必须至少有一个数字。

然后根据每个字符的合法性,以及和前后字符组合后是否合法进行判断。

 

代码:

class Solution {
public:
    bool isNumber(const char *s) {
        int i=0;
		int ne=0,ndoc=0,nmin=0,num=0,flag=0;	//e的数量,点的数量,正负号的数量,是否在数字、e、正负号之后出现空格
		while(*(s+i)!='\0')
		{
			if(*(s+i)==' ')	//当前位置是空格
			{
				if(i==0||*(s+i-1)==' ')	//空格之前是空格
					i++;
				else	//有效字符后出现空格
				{
					flag=1;
					i++;
				}
			}
			else if(*(s+i)>='0'&&*(s+i)<='9')	//当前位置是数字
			{
				if(flag==1)	//之前出现过有效字符之后的空格
					return false;
				i++;
				num++;
			}
			else if(*(s+i)=='.')	//当前位置是点
			{
				if(flag==1)
					return false;
				if(ndoc>=1||ne>=1)	//点不能多余1,点之前不能有e
					return false;
				if(i!=0&&(*(s+i-1)=='.'||*(s+i-1)=='e'))	//点之前不能是点,e
					return false;
				if(*(s+i+1)!='\0'&&(*(s+i+1)=='.'||*(s+i+1)=='-'||*(s+i+1)=='+'))	//点之后不能是点,正负号
					return false;
				if((i==0||*(s+i-1)<'0'||*(s+i-1)>'9')&&(*(s+i+1)=='\0'||(*(s+i+1)<'0'||*(s+i+1)>'9')))	//点前后必须至少有一个数字
					return false;
				ndoc++;
				i++;
			}
			else if(*(s+i)=='e')	//当前位置是e
			{
				if(flag==1)
					return false;
				if(ne>=1)			//e不能多余1
					return false;
				if(i==0)			//之前必须有数字或者点
					return false;
				if(*(s+i-1)!='.'&&(*(s+i-1)<'0'||*(s+i-1)>'9'))
					return false;
				if(*(s+i+1)=='\0')	//之后必须出现正负号或者数字
					return false;
				if(*(s+i+1)!='-'&&*(s+i+1)!='+'&&(*(s+i+1)<'0'||*(s+i+1)>'9'))
					return false;
				ne++;
				i++;
			}
			else if(*(s+i)=='-'||*(s+i)=='+')	//当前位置是正负号
			{
				if(flag==1)
					return false;
				if(nmin>=2)			//正负号不能多余2
					return false;
				if(i!=0&&*(s+i-1)!=' '&&*(s+i-1)!='e')	//之前只能为空格或者e
					return false;
				if(*(s+i+1)=='\0')	//之后必须为点或者数字
					return false;
				if(*(s+i+1)!='.'&&*(s+i+1)<'0'||*(s+i+1)>'9')
					return false;
				nmin++;
				i++;
			}
			else
				return false;
		}
		return num>0;
    }
};


 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值