65. Valid Number
来源:互联网 发布:贵州浪人网络投诉 编辑:程序博客网 时间:2024/06/07 16:20
65.Valid Number
Validate if a given string is numeric.
Some examples:
“0” => true
” 0.1 ” => true
“abc” => false
“1 a” => false
“2e10” => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
思路:http://blog.csdn.net/suwei19870312/article/details/12094233
用有限状态机来做。。
我想到的一些情况。
1、空格+数字+空格
比如:“1”“1 ”
2、空格+点+数字+空格
比如:“.1” ” .23 ”
3、空格+符号+数字+空格
比如:“ +1 ” “ -1234 ”
4、空格+符号+点+数字+空格
比如:“+.2” “-.234”
5、空格+数字+e/E+数字+空格
比如:“ 2e13 ”
其实这分类有点乱的。
不过状态机的好处就是当你好像漏了个情况,你再多加个状态就好了,改改数组,逻辑符号根本不用改,等会分类你会看到我再写代码才发现” 卧槽,居然“3.”也是true”感慨。。。然而并不影响,多加了3个状态后就accept了
我们可以假设初始状态为状态0.
然后我上个图吧,不然看着状态转来转去也累。
这个转换图可能有更简洁的,你也可以有自己设计的更好的状态图
我这一开始是定义到末尾空格8个状态,后面发现还有这几个奇葩也为true,仔细一想确实对的。
第一种奇葩:“3.” “3.e10”
这种点后不跟数字也对的,所以状态2遇到空格后会切换到状态7(这里状态从0开始),我一开始是那个状态2遇到空格是-1来着。
当然这种点之前是有数字的,必须是有数字的,所以我对于开头就点(点之前没数字)这种情况多上个状态8来表示。点之前有数字还可以接E/e,但开头就点的那种情况就没有那么好的福利了,后面必须跟数字才对,所以你会发现状态8中只有遇到数字才有出路。
第二种奇葩:“6e+6”为true
这里因为“6e+6.5”是false的,所以不能转到状态3,于是我又设了2个状态,首先是E/e接符号,设为状态9,然后是接完符号必须接一个数字,还必须是整数,也就是说只能接数字和空格,这与状态1不一样,所以设为状态10。
代码:
class Solution {public: bool isNumber(string s) { enum CHA{ SPACE, NUM, FUHAO, DOT, E, INVAID, NUMINP }; int transitionTab[][NUMINP]= { 0,1,3,8,-1,-1, 7,1,-1,2,4,-1, 7,5,-1,-1,4,-1, -1,1,-1,8,-1,-1, -1,6,9,-1,-1,-1, 7,5,-1,-1,4,-1, 7,6,-1,-1,-1,-1, 7,-1,-1,-1,-1,-1, -1,5,-1,-1,-1,-1, -1,10,-1,-1,-1,-1, 7,10,-1,-1,-1,-1 }; int state=0; int siz=s.size(); if(siz==0) { return false; } int ptr=0; CHA zifu=INVAID; while(ptr<siz) { switch(s[ptr]) { case ' ': zifu=SPACE; break; case '0':case'1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': zifu=NUM; break; case '+':case '-': zifu=FUHAO; break; case '.': zifu=DOT; break; case 'e':case 'E': zifu=E; break; default: zifu=INVAID; break; } state = transitionTab[state][zifu]; if(state==-1) break; ++ptr; } return state==1 ||state==5 || state==6 || state==7 || state==2||state==10; }};
- LeetCode --- 65. Valid Number
- [Leetcode] 65. Valid Number
- [LeetCode]65.Valid Number
- 65. Valid Number
- Leetcode-65.Valid Number
- 65. Valid Number
- 【leetcode】65.Valid Number
- leetcode 65. Valid Number
- LeetCode 65. Valid Number
- Leetcode 65. Valid Number
- 65. Valid Number
- 65. Valid Number
- LeetCode 65. Valid Number
- LeetCode - 65. Valid Number
- 65. Valid Number
- [LeetCode] 65. Valid Number
- leetcode 65.Valid Number
- 65. Valid Number
- ZOJ Problem Set
- 《算法概论》习题8.3证明
- POJ 1010--STAMPS
- 51nod 1450 闯关游戏
- hadoop2.7.3伪分布式安装
- 65. Valid Number
- POJ3469 Dual Core CPU 【最大流最小割】
- Android实现自定义自画的图片的Button
- [线段树][单调栈]HackerRank 101 Hack 50 .Boxes for Toys
- 水题 第一站 精挑细选
- 网页插入视频&用图片做超链接
- 行优先存储和列优先存储
- selenium中级教程
- Android Percentlayout百分比布局