Valid Number
本题需要注意的是边界条件设置过多,因此通过率不高。
"0"
=> true //单个
" 0.1 "
=> true //两边空格先去掉 有小数点的情况
"abc"
=> false //有非e字母的情况
"1 a"
=> false //有非e字母的情况
"2e10"
=> true//有e字母的情况
除了上述题目给出的边界条件以外,还有下述需要注意的例子:
" 005047e+6"=>
true//有e字母和符号的情况
"32.e-80123"=>
true//有e字母和符号和小数点的情况
"46.e3"=>
true//有e字母和小数点的情况
".e1"=>false //.e之前无数字的情况
" -."=>false//无数字的情况
"+.8"=>
true//有符号和小数点的情况
"-1."=>
true//有符号和小数点的情况
"."=>false//单个
AC代码:
class Solution {
public:
bool isNum(char n){
if(n<'0'||n>'9')
return false;
return true;
}
bool isNumber(string s) {
if(!s.size())
return false;
int p=0,q=s.size()-1,flage=0,flagp=0;
//去掉首尾空格
while(s[p]==' '){p++;}
while(s[q]==' '){q--;}
//e符号不能在头和尾 不能全为空格
if(s[p]=='e'||s[q]=='e'||p>q)
return false;
//开头可以有符号
if(s[p]=='-'||s[p]=='+') p++;
if(p==q){
if(isNum(s[p]))return true;
else return false;
}
for(int i=p;i<=q;i++){
if(s[i]=='.'){
// '.e'组合情况 后面要跟数字或者符号数字 注意先判断i不要越界
if(i<q-1&&s[i+1]=='e'&&isNum(s[i-1])){
if(isNum(s[i+2])) i+=2;
else if(i<q-2&&(s[i+2]=='-'||s[i+2]=='+')&&isNum(s[i+3]))
i+=3;
else return false;
flagp=1;
continue;
}
// '.'只能出现一次,后面必须有数字
else if(flage||flagp||(i>=p+1&&!isNum(s[i-1]))||(i<=q-1&&!isNum(s[i+1])))
return false;
flagp=1;
}
else if(s[i]=='e'){
// 'e'后面有符号时再后面必须有数字
if(i<q-1&&(s[i+1]=='-'||s[i+1]=='+')&&isNum(s[i+2]))
{flage=1;i+=2;continue;}
// 'e'只能出现一次,前后必须有数字
if(flage||!(isNum(s[i-1])&&isNum(s[i+1])))
return false;
flage=1;
}
else if(!isNum(s[i]))
return false;
}
return true;
}
};
运行时间:
本题看其他大神也可以用有限状态机