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; } };