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.
Solution: This finite-state machine solution. Learn from fuwutu & snakeDling.
1 class Solution { 2 public: 3 bool isNumber(const char *s) { 4 enum InputType {INVALID, SPACE, SIGN, DIGIT, DOT, EXPONENT}; 5 int transitionTable[][6] = 6 { /* 0 1 2 3 4 5 */ 7 0, 1, 2, 3, 4, 0, // 0: INVALID 8 0, 1, 2, 3, 4, 0, // 1: SPACE 9 0, 0, 0, 3, 4, 0, // 2: SIGN 10 0, 6, 0, 3, 7, 5, // 3: DIGIT 11 0, 0, 0, 7, 0, 0, // 4: DOT 12 0, 0, 2, 8, 0, 0, // 5: EXPONENT 13 0, 6, 0, 0, 0, 0, // 6: END WITH SPACE 14 0, 6, 0, 7, 0, 5, // 7: DOT AND DIGIT 15 0, 6, 0, 8, 0, 0, // 8: END WITH SPACE OR DIGIT 16 }; 17 18 InputType last = INVALID; 19 while (*s != '\0') 20 { 21 InputType state = INVALID; 22 if (*s == ' ') 23 state = SPACE; 24 else if (isdigit(*s)) 25 state = DIGIT; 26 else if (*s == '+' || *s == '-') 27 state = SIGN; 28 else if (*s == 'e') 29 state = EXPONENT; 30 else if (*s == '.') 31 state = DOT; 32 last = (InputType) transitionTable[last][state]; 33 if (last == INVALID) return false; 34 s++; 35 } 36 bool validFinal[] = {0, 0, 0, 1, 0, 0, 1, 1, 1}; 37 return validFinal[last]; 38 } 39 };