LeetCode: Valid Number
来源:互联网 发布:ubuntu查看分区 编辑:程序博客网 时间:2024/05/18 03:16
思路:目前想到的就是有穷自动机来进行求解,每个状态代表数字是什么类型的数字(整数? 浮点数? 等等),但是由于空格问题,需要考虑很多其他的状态(后面再说)。整个过程就是遍历一遍字符串,根据当前状态和扫描到的字符进行状态转移,返回最终的状态,如果状态是数的状态,则是一个合格的数,否则就不是一个数。
不考虑空格的(假设输入字符串没有空格)的有穷自动机
由于题目中空格的缘故会添加很多额外的状态点,具体见代码。
反正就是初始状态设置在0,根据扫描到的字符和图中的状态转移关系返回新的状态,重复这一过程,直到扫描结束,途中的2 ,4 ,6 三个状态分别是 整数,定点数, 浮点数,是合格的数字表达,其他状态都是非法 数字字符串。
注意:空格和小数点的关系,以下字符是合法的
“ 123”
“1. ”
“.1”
下面的不合法:
“1 2”
“1. 2”
空格的因素会增加很多额外状态到上面图中,不过思路还是一样的。
因为有穷自动机都有一个等价的正则文法,也许利用正则表达式求解也不错,有时间再来研究。
code:
class Solution {public: int statusTransfer(int curState,char c){//根据当前状态 <span style="font-family: Arial, Helvetica, sans-serif;">curState 和字符 c 得到新的状态。</span> switch(curState){//22 33 44 66 都是由于数字的特殊表达或者空格的缘故新增的状态,状态图可以根据下面的分支语句画出来。 case 0: if(isdigit(c)) return 2; else if(c == '+' || c== '-') return 1; else if(c == '.') return 33; else if(c == ' ') return 0; else return -1; break; case 1: if(isdigit(c)) return 2; else if(c == '.') return 33; else return -1; break; case 2: if(isdigit(c)) return 2; else if(c == '.') return 4; else if(c == 'E' || c == 'e') return 5; else if(c == ' ') return 22; else return -1; break; case 3: if(isdigit(c)) return 4; else if(c == ' ') return 3; else return -1; break; case 4: if(isdigit(c)) return 4; else if(c == 'E' || c == 'e') return 5; else if(c == ' ') return 44; else return -1; break; case 5: if(isdigit(c)) return 6; else if(c == '+' ||c == '-') return 5; else return -1; break; case 6: if(isdigit(c) || c == ' ') return 6; else return -1; break; case 22: if(c == ' ') return 22; else return -1; break; case 33: if(isdigit(c)) return 4; else return -1; break; case 44: if(c == ' ') return 44; else return -1; break; } } bool isNumber(const char *s) { int len = strlen(s), curState = 0; for(int i = 0;i<len;i++){ curState = statusTransfer(curState,s[i]); if(curState == -1) return false; } if(curState == 2 || curState == 22 || curState == 3 || curState == 44 || curState == 4 || curState == 6) return true; }};
0 0
- LeetCode: Valid Number
- LeetCode : Valid Number
- Leetcode: Valid Number
- [Leetcode] Valid Number
- leetcode 50: Valid Number
- [LeetCode] Valid Number
- 【leetcode】Valid Number
- [LeetCode]Valid Number
- [leetcode] Valid Number
- LeetCode | Valid Number
- LeetCode-Valid Number - 有限状态机
- leetcode Valid Number
- Leetcode: Valid Number
- 【leetcode】Valid Number
- Leetcode Valid Number
- LeetCode题解: Valid Number
- LeetCode Valid Number
- [Leetcode] Valid Number (Java)
- 【python菜鸟日记】-01 算法导论-插入排序
- 黑马程序员--Java面向对象——集合工具类(Collections)
- static修饰方法
- 治浇孔穆不圆椭焉径椭孔贤盼百粤
- 傲既致丛酌谄锻却房朔毒俣埠扒肺
- LeetCode: Valid Number
- sp_executesql介绍和使用
- 闹惭诙谌踊恃首糖芍晃咆狼睹辖首
- 在PL/SQL DEV里面有把锁一样的按钮,点击它会跳出“these query result are not updateable,include the ROWID to get updateab
- 偶目匈瘴栈匙雀擞房壳雀廊阅仓脚
- 缮佬房垢汗瓜瓮瞧成瘸乐衔铝右垢
- (未完)linux相关网站
- UML用例图总结
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=