65. Valid Number

来源:互联网 发布:秋水南风 捏脸数据成男 编辑:程序博客网 时间:2024/06/13 21:17

题目:

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.

解析:

本题分很多状态:

0初始无输入或者只有space的状态
1输入了数字之后的状态
2前面无数字,只输入了Dot的状态
3输入了符号状态
4前面有数字和有dot的状态
5'e' or 'E'输入后的状态
6输入e之后输入Sign的状态
7输入e后输入数字的状态
8前面有有效数输入之后,输入space的状态

共9种状态了,难设计的是6,7,8状态。

分好之后就好办了,设计出根据输入进行状态转换就OK了。

代码:

class Solutionl

{

public:

bool isNumber(const char*s)

{

enum InputType

{

INVALID,//0

SPACE,//1

SIGN,//2

DIGIT,//3

DOT,//4

EXPONENT,//5

NUM_INPUTS // 6

};

int transitionTable[][NUM_INPUTS] =

{

-1,0,3,1,2, -1,//next statesforstate0

-1,8, -1,1,4,5,//next statesforstate1

-1, -1, -1,4, -1, -1,//next statesforstate2

-1, -1, -1,1,2, -1,//next statesforstate3

-1,8, -1,4, -1,5,//next statesforstate4

-1, -1,6,7, -1, -1,//next statesforstate5

-1, -1, -1,7, -1, -1,//next statesforstate6

-1,8, -1,7, -1, -1,//next statesforstate7

-1,8, -1, -1, -1, -1,//next statesforstate8

};

intstate =0;

while (*s != '\0')

{

InputType inputType = INVALID;

if (isspace(*s))

inputType = SPACE;

elseif (*s == '+' || *s == '-')

inputType = SIGN;

elseif (isdigit(*s))

inputType = DIGIT;

elseif (*s == '.')

inputType = DOT;

elseif (*s == 'e' || *s == 'E')

inputType = EXPONENT;

state = transitionTable[state][inputType];

if (state == -1)

return false;

else

++s;

}

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

}

};


0 0
原创粉丝点击