【leetcode】Valid Number
2015-11-19 23:28
155 查看
目前leetcode上AC率最低的一题。第一次实战有限状态机,终于摸到点皮毛了。
输入存在6种情况:
0 无效值
INVALID
1 空白符
SPACE
2 正负号
SIGN
3 小数点
DOT
4 数字
NUMBER
5 指数符
EXPONENT
通过在Custom Testcase输入测试用例,可以看出合法的格式,不一一列出。
状态跳转情况(英文表示该状态可以接受的输入,紧跟的数字表示将会跳转至哪个状态):
状态0:SPACE 0, SIGN 1, DOT 2, NUMBER 3
状态1:DOT 2, NUMBER 3
状态2:NUMBER 4
状态3(合法结束):DOT 4, NUMBER 3, EXPONENT 5, SPACE 8
状态4(合法结束):EXPONENT 5, NUMBER 4, SPACE 8
状态5:SIGN 6, NUMBER 7
状态6:NUMBER 7
状态7(合法结束):NUMBER 7, SPACE 8
状态8(合法结束):SPACE 8
代码使用到状态转移表,行号代表状态,列号代表当前输入情况,元素数值代表即将跳转至的状态。
Reference:https://github.com/fuwutu/LeetCode/blob/master/Valid%20Number.cpp
输入存在6种情况:
0 无效值
INVALID
1 空白符
SPACE
2 正负号
SIGN
3 小数点
DOT
4 数字
NUMBER
5 指数符
EXPONENT
通过在Custom Testcase输入测试用例,可以看出合法的格式,不一一列出。
状态跳转情况(英文表示该状态可以接受的输入,紧跟的数字表示将会跳转至哪个状态):
状态0:SPACE 0, SIGN 1, DOT 2, NUMBER 3
状态1:DOT 2, NUMBER 3
状态2:NUMBER 4
状态3(合法结束):DOT 4, NUMBER 3, EXPONENT 5, SPACE 8
状态4(合法结束):EXPONENT 5, NUMBER 4, SPACE 8
状态5:SIGN 6, NUMBER 7
状态6:NUMBER 7
状态7(合法结束):NUMBER 7, SPACE 8
状态8(合法结束):SPACE 8
代码使用到状态转移表,行号代表状态,列号代表当前输入情况,元素数值代表即将跳转至的状态。
bool isNumber(char* s) { enum InputType { INVALID, SPACE, SIGN, DOT, NUMBER, EXPONENT, NUM_STATE, }; int transTable[][NUM_STATE] = { -1, 0, 1, 2, 3, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, 4, -1, -1, 8, -1, 4, 3, 5, -1, 8, -1, -1, 4, 5, -1, -1, 6, -1, 7, -1, -1, -1, -1, -1, 7, -1, -1, 8, -1, -1, 7, -1, -1, 8, -1, -1, -1, -1 }; int state = 0; int inputType = 0; while (*s != '\0') { if (isspace(*s)) inputType = SPACE; else if (*s == '+' || *s == '-') inputType = SIGN; else if (*s == '.') inputType = DOT; else if (isdigit(*s)) inputType = NUMBER; else if (*s == 'E' || *s == 'e') inputType = EXPONENT; else inputType = INVALID; state = transTable[state][inputType]; if (state == -1) return false; ++s; } return state == 3 || state == 4 || state == 7 || state == 8; }
Reference:https://github.com/fuwutu/LeetCode/blob/master/Valid%20Number.cpp
相关文章推荐
- 高性能的索引策略(上)
- apache+tomcat+jk 负载均衡初篇
- NSUserDefaults的用法以及注意事项
- 切换到MarkDown编辑器
- [zz]Token验证失败的解决方法
- google三大论文
- Qt 查询文档
- 环状序列UVa1584紫苏第三章
- Python安装第三方模块的方法
- Android-Volley源码分析
- OC实现的电话号码格式化Demo
- 第一次spring冲刺第8天
- svn中的图标解释
- 关于 Android Volley框架缓存
- Python机器学习2-股票信息简单抓取
- 欢迎使用CSDN-markdown编辑器
- Android Studio更换眼睛保护背景色
- 几张图看懂列式存储(转)
- 可操作提示设计思路
- (spring-第7回【IoC基础篇】)BeanDefinition的载入与解析&&spring.schemas、spring.handlers的使用