题目

valid-number


算法

* 直接模拟

http://www.cnblogs.com/grandyang/p/4084408.html

* 直接模拟的优化

* 有限状态机

http://blog.csdn.net/suwei19870312/article/details/12094233

http://blog.csdn.net/kenden23/article/details/18696083

* strtod函数

http://c.biancheng.net/cpp/html/128.html

* 正则表达式

http://blog.csdn.net/fightforyourdream/article/details/12900751


代码

* 优先状态机


class Solution {

public:

    bool isNumber(const char *s) {

        enum InputType {

            INVALID,        // 0 Include: Alphas, '(', '&' ans so on

            SPACE,        // 1

            SIGN,        // 2 '+','-'

            DIGIT,        // 3 numbers

            DOT,            // 4 '.'

            EXPONENT,        // 5 'e' 'E'

        };

        int transTable[][6] = {

        //0INVA,1SPA,2SIG,3DI,4DO,5E

            -1,  0,  3,  1,  2, -1,//0初始无输入或者只有space的状态

            -1,  8, -1,  1,  4,  5,//1输入了数字之后的状态

            -1, -1, -1,  4, -1, -1,//2前面无数字,只输入了Dot的状态

            -1, -1, -1,  1,  2, -1,//3输入了符号状态

            -1,  8, -1,  4, -1,  5,//4前面有数字和有dot的状态

            -1, -1,  6,  7, -1, -1,//5'e' or 'E'输入后的状态

            -1, -1, -1,  7, -1, -1,//6输入e之后输入Sign的状态

            -1,  8, -1,  7, -1, -1,//7输入e后输入数字的状态

            -1,  8, -1, -1, -1, -1,//8前面有有效数输入之后,输入space的状态

        };

        int state = 0;

        for(int i=0;i<s.size();++i)

        {

            InputType input = INVALID;

            if (s[i] == ' ') input = SPACE;

            else if ( s[i]== '+' || s[i] == '-') input = SIGN;

            else if (isdigit(s[i])) input = DIGIT;

            else if (s[i] == '.') input = DOT;

            else if (s[i] == 'e' || s[i] == 'E') input = EXPONENT;

            state = transTable[state][input];

            if (state == -1) return false;



        }

        return state == 1 || state == 4 || state == 7 || state == 8;

    }

};

results matching ""

    No results matching ""