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;    }};
原创粉丝点击