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.

解析:

本题分很多状态:

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 states for state 0

-1, 8, -1, 1, 4, 5, // next states for state 1

-1, -1, -1, 4, -1, -1, // next states for state 2

-1, -1, -1, 1, 2, -1, // next states for state 3

-1, 8, -1, 4, -1, 5, // next states for state 4

-1, -1, 6, 7, -1, -1, // next states for state 5

-1, -1, -1, 7, -1, -1, // next states for state 6

-1, 8, -1, 7, -1, -1, // next states for state 7

-1, 8, -1, -1, -1, -1, // next states for state 8

};

int state = 0;

while (*s != '\0')

{

InputType inputType = INVALID;

if (isspace(*s))

inputType = SPACE;

else if (*s == '+' || *s == '-')

inputType = SIGN;

else if (isdigit(*s))

inputType = DIGIT;

else if (*s == '.')

inputType = DOT;

else if (*s == 'e' || *s == 'E')

inputType = EXPONENT;

state = transitionTable[state][inputType];

if (state == -1)

return false;

else

++s;

}

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

}

};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值