题目
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;
}
};