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.
网上有人的实现方法很不错,加了些注释
有限自动机
class Solution {
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:e
-1, -1, -1, 7, -1, -1, // next states for state 6:e后面的正负号
-1, 8, -1, 7, -1, -1, // next states for state 7:e后面的数字
-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;
// Get next state from current state and input symbol
state = transitionTable[state][inputType];
// Invalid input
if (state == -1) return false;
else ++s;
}
// If the current state belongs to one of the accepting (final) states,
// then the number is valid
return state == 1 || state == 4 || state == 7 || state == 8;
}
};
使用strtod
class Solution {
public:
bool isNumber(const char *s) {
char * endptr;
strtod(s,&endptr);
if(endptr==s)return false;
for(;*endptr;++endptr)
if(!isspace(*endptr))return false;
return true;
}
};