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.
思路:用有效自动机来标记每一种状态,在画自动机时要将每种状态严格区分开来,并作好记录。
- bool isNumber(const char *s) {
- int size = strlen(s);
- if(size == 0) return false;
- enum input{INVALID,SPACE,SIGN,DOT,DIGIT,EXP,NUMBER};
- int state[][NUMBER] = {
- -1,0,1,2,3,-1, // 0,empty { space,sign,dot,digit}
- -1,-1,-1,2,3,-1, // 1,sign { dot,digit}
- -1,-1,-1,-1,4,-1, //2,dot / e+/d {digit}
- -1,8,-1,4,3,5, // 3,digit; {digit,space,dot,exp}
- -1,8,-1,-1,4,5, // 4,dot+digit { digit,space,exp}
- -1,-1,7,-1,6,-1, // 5,(digit+dot)e/E + S {sign,digit}
- -1,8,-1,-1,6,-1, // 6, {digit,space}
- -1,-1,-1,-1,6,-1,// 7. (digit + dot)e/E + d { digit}
- -1,8,-1,-1,-1,-1 // space {space}
- };
- int state_number = 0;
- while(*s!='\0') {
- char cur = *s;
- if(cur == ' ') {
- state_number = state[state_number][SPACE];
- }else if(cur == '+' || cur=='-') {
- state_number = state[state_number][SIGN];
- } else if(cur=='.') {
- state_number = state[state_number][DOT];
- } else if(cur == 'e' ||cur == 'E') {
- state_number = state[state_number][EXP];
- } else if(isdigit(cur)) {
- state_number = state[state_number][DIGIT];
- } else {
- return false;
- }
- if(state_number == -1) return false;
- s++;
- }
- return state_number == 6 || state_number == 8 || state_number==3 || state_number == 4;
- }

浙公网安备 33010602011771号