验证给定的字符串是否可以解释为十进制数字。
例如:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
" -90e3 "
=> true
" 1e"
=> false
"e3"
=> false
" 6e-1"
=> true
" 99e2.5 "
=> false
"53.5e93"
=> true
" --6 "
=> false
"-+3"
=> false
"95a54e53"
=> false
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
- 数字 0-9
- 指数 - "e"
- 正/负号 - "+"/"-"
- 小数点 - "."
当然,在输入中,这些字符的上下文也很重要
bool isNumber(char * s){
bool first_part_decimal=false,first_start_appear=false,first_part_symbol=false;
bool second_part_symbol=false,second_start_appear=false,second_part_begin=false;
int len=strlen(s);
if(len==0)return false;
int pos=0;
while(s[pos]==' ')
{
pos++;
}
while(s[len-1]==' ')
{
len--;
if(len<=0)return false;
}
for(;pos<len;pos++)
{
if(s[pos]!='.'&&s[pos]!='e'&&s[pos]!='-'&&s[pos]!='+'&&(s[pos]<'0'||s[pos]>'9'))
{
return false;
}
else if(s[pos]>='0'&&s[pos]<='9')
{
first_start_appear=true;
}
else if(s[pos]=='.')
{
//多个.
if(first_part_decimal)return false;
first_part_decimal=true;
}
else if(s[pos]=='e')
{
pos++;
second_part_begin=true;
break;
}
else
{//符号出现在数字和.之后
if(first_start_appear||first_part_decimal)return false;
//只允许出现一次符号
if(first_part_symbol)return false;
first_part_symbol=true;
}
}
if(second_part_begin)
{
for(;pos<len;pos++)
{
if(s[pos]!='+'&&s[pos]!='-'&&(s[pos]<'0'||s[pos]>'9'))
{
return false;
}
if(s[pos]=='+'||s[pos]=='-')
{//符号出现在数字之后
if(second_start_appear)return false;
//多个符号
if(second_part_symbol)return false;
second_part_symbol=true;
}
else
{
second_start_appear=true;
}
}
}
bool ret;
if(second_part_begin)
{
ret=first_start_appear&&second_start_appear;
}
else
{
ret=first_start_appear;
}
return ret;
}
执行用时 : 4 ms, 在Valid Number的C提交中击败了96.67% 的用户
内存消耗 : 6.9 MB, 在Valid Number的C提交中击败了50.00% 的用户