Valid Number leetcode
2016-07-21 14:43
525 查看
Valid Number
本题需要注意的是边界条件设置过多,因此通过率不高。
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;
}
};
运行时间:
本题看其他大神也可以用有限状态机
本题需要注意的是边界条件设置过多,因此通过率不高。
"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;
}
};
运行时间:
本题看其他大神也可以用有限状态机
相关文章推荐
- nginx配置的一点问题
- 搜索框的使用
- ScrollView嵌套GridView
- 宽搜(BFS)经典&简单题目 - 奇怪的电梯
- android日期选择控件DatePicker小结
- 绝对众数的求法
- 基于RBAC的saas权限系统设计
- poj 3461Oulipo
- 三阶魔方教程
- ANDROID SHAPE画圆形背景实现圆形TextView
- 谈谈javascript的Function中那些隐藏的属性/方法:caller/callee/apply/call/bind
- Java学习之路:不走弯路,就是捷径
- 安卓多线程之异步任务类解决子线程无法返回数据
- cookie和session
- 除非你是BAT,前端开发中最好少造轮子
- Windows环境下安装Redis
- FIFO管道通信(linux)
- .net/c#常用框架/中间件简介(不定时更新)
- cc2530启动流程---广播发送数据
- 简易画板-保存文件-刷新图库