您的位置:首页 > 其它

Valid Number leetcode

2016-07-21 14:43 525 查看
Valid Number 

本题需要注意的是边界条件设置过多,因此通过率不高。

"0"
 => 
true
    //单个

" 0.1 "
 => 
true
//两边空格先去掉 有小数点的情况

"abc"
 => 
false
 //有非e字母的情况

"1 a"
 => 
false //有非e字母的情况

"2e10"
 => 
true//有e字母的情况


除了上述题目给出的边界条件以外,还有下述需要注意的例子:


"
005047e+6"=> true//有e字母和符号的情况



"32.e-80123"[b]=> true//有e字母和符号和小数点的情况
[/b]


[b]"46.e3"=> true//有e字母和小数点的情况
[/b]


[b]".e1"=>false
//.e之前无数字的情况
[/b]

[b]"
-."=>false//无数字的情况
[/b]

"+.8"[b]=> true//有符号和小数点的情况
[/b]


"-1."[b]=> true//有符号和小数点的情况
[/b]


"."[b]=>false//单个[/b]


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



运行时间:






本题看其他大神也可以用有限状态机
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: