Leetcode---Valid Number
2015-03-07 20:15
281 查看
Validate if a given string is numeric.
Some examples:
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
判断一个string是不是数字。非常麻烦的一道题,对于算法意义不大。
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.
判断一个string是不是数字。非常麻烦的一道题,对于算法意义不大。
enum State {I, // integer ->{'+','-'}[0-9]+ D, // double ->Integer{'.'}[0-9]+ E, // number with exponential ->{D,I}{'e','E'}Integer+ PI,// potential I ->{'+','-'} PD,// potential D ->Integer{'.'} PE,// potential E ->{D,I}{'e','E'}{'+','-'}* F // Fail }; bool allow(char c){ if('0' <= c && c <= '9') return true; char token[] = {'e', 'E', '.', '+', '-'}; for(unsigned int i = 0; i < sizeof(token)/sizeof(char); ++i){ if (c == token[i]) return true; } return false; } bool isNumber(const char *s) { if(s == NULL) return false; while(*s == ' ') s++; string str(s); while(str.back() == ' ') str.pop_back(); if(str.length() == 0) return false; bool firstDigit = false; for(unsigned int i = 0; i < str.length(); ++i){ char c = str[i]; if(!allow(c)) return false; if(!firstDigit && '0' <= c && c <= '9') firstDigit = true; } if(!firstDigit) return false; // str.length > 0, all characters are allowed, at least one digit State state; firstDigit = false; // initialize state switch(str[0]){ case '+': case '-': state = PI; break; case '.': state = PD; break; case 'e': case 'E': state = F; break; default: // [0-9] state = I; firstDigit = true; } for(unsigned int i = 1; i < str.length() && state != F; ++i){ char c = str[i]; if(c == '+' || c == '-'){ switch(state){ case PE: { char prevChar = str[i-1]; if(prevChar != '+' || prevChar != '-') state = PE; else state = F; break; } default: state = F; } }else if(c == 'e' || c == 'E'){ switch(state){ case I: case D: state = PE; break; case PD: if(firstDigit) state = PE; else state = F; break; default: state = F; } }else if(c == '.'){ switch(state){ case I: case PI: state = PD; break; default: state = F; } }else{ // c = [0-9] firstDigit = true; switch(state){ case I: case PI: state = I; break; case D: case PD: state = D; break; case E: case PE: state = E; } } } return state == I || state == D || state == PD || state == E; } };
相关文章推荐
- LeetCode65 Valid Number 解题报告
- leetcode-65-Valid Number
- LeetCode(65) Valid Number
- LeetCode - Valid Number - Frequent
- [LeetCode] Valid Number
- LeetCode: Valid Number
- leetcode ||65、 Valid Number
- [leetcode]Valid Number
- LeetCode 第 65 题(Valid Number)
- Leetcode_65 Valid Number
- LeetCode-Valid Number-合法数字-状态机
- [leetcode]Valid Number
- leetcode---Valid Number
- [LeetCode]Valid Number
- LeetCode Online Judge 题目C# 练习 - Valid Number
- LeetCode-Valid Number - 有限状态机
- [LeetCode]Valid Number
- LeetCode——Valid Number
- LeetCode - Valid Number
- [leetcode] Valid Number