LeetCode Valid Number 有效数字(有限自动机)
2015-07-31 15:39
393 查看
题意:判断一个字符串是否是一个合法的数字,包括正负浮点数和整形。
思路:有限自动机可以做,画个图再写程序就可以解决啦,只是实现起来代码的长短而已。
下面取巧来解决,分情况讨论:
(1)整数
(2)浮点数
(3)整数e整数
(4)浮点数e整数
只有以上4种情况。但是要数之前可能带1个符号,这个可以直接过滤1个,而不影响结果。而且,其包含关系是从上到下扩展的,(1)扩展到(2),(3)扩展到 (4)。
那么先解决符号 e 之前的,必须满足:正负号至多1个,有数字1个以上,点至多1个。
如果没有e,那么可以结束了。若有e,跳过1个e,再继续。
解决e后面的,必须满足:正负号至多1个,有数字1个以上,没有点。
AC代码
思路:有限自动机可以做,画个图再写程序就可以解决啦,只是实现起来代码的长短而已。
下面取巧来解决,分情况讨论:
(1)整数
(2)浮点数
(3)整数e整数
(4)浮点数e整数
只有以上4种情况。但是要数之前可能带1个符号,这个可以直接过滤1个,而不影响结果。而且,其包含关系是从上到下扩展的,(1)扩展到(2),(3)扩展到 (4)。
那么先解决符号 e 之前的,必须满足:正负号至多1个,有数字1个以上,点至多1个。
如果没有e,那么可以结束了。若有e,跳过1个e,再继续。
解决e后面的,必须满足:正负号至多1个,有数字1个以上,没有点。
class Solution { public: bool isNumber(string s) { int i=0, d=0; while( !s.empty() && s[s.size()-1]==' ' ) //直接删后缀空格 s.erase(s.end()-1); while(i<s.size() && s[i]==' ') //忽略前缀空格 i++; if( s[i]=='+' || s[i]=='-' ) i++; //这个符号出现了等于没出现 while(i<s.size() && isdigit(s[i])) i++,d++; if(i<s.size()&&s[i]=='.') i++; while(i<s.size() && isdigit(s[i])) i++,d++; if(!d) return false; //保证e之前不为空,且合法 //以上是e前的情况 if(i==s.size()) return true; else if(s[i]!='e') return false; //有e出现则e后不能空。无e则出错 //下面e后的情况 if(s[++i]=='+'||s[i]=='-') i++; //可以有符号 d=0; while(i<s.size()&& isdigit(s[i])) //只能出现整数了 i++,d++; if(d && i==s.size()) return true; else return false; } };
AC代码
相关文章推荐
- 逆序对的求解
- 【Android本地开发技术:媒体开发】AVI视频格式解析
- 《深入理解Nginx 模块开发与架构解析》笔记之定时器
- Python学习资料汇总
- Qt 5.3 下OpenCV 2.4.11 开发(7)单通道直方图绘制
- eclipse配置本地服务
- String cannot be resolved to a type
- 滑动门的例子
- 【原创】相对完美的垂直居中popup(modal/dialog),无需监听window.resize事件
- 显示虚线
- leetcode 074 —— Search a 2D Matrix
- 如何实现HTTP DIGEST认证
- 探究Android系统中解析JSON数据的方式
- 判断填写的邮箱里是否有“@”
- 关于将Webpack,编译文件输出到不同的目录下
- C语言——计算文件大小(二)
- 黑马程序员-------集合框架之HashSet
- FFT模板
- 搞颠provider,factory 和service
- oracle,mysql,SqlServer三种数据库的分页查询总结