本题WA了无数次,最后逼迫无奈,只能根据WA的情形,对程序不断修正才AC掉的,绝逼痛苦。
My Solution:
class Solution {
public:
bool checkD(const char *s, int i){
if(i == beg && i == end){
return false;
}
if(i == beg && (s[i+1] <'0' || s[i+1] > '9')){
return false;
}
if(i == end && (s[i-1] < '0' || s[i-1] < '0')){
return false;
}
return true;
}
bool checkE(const char *s, int &i){
if(i == beg || i == end){
return false;
}
i++;
if(s[i] == '+' || s[i] == '-'){
i++;
}
if(i > end){
return false;
}
while(i <= end){
if(s[i] >= '0' && s[i] <= '9'){
i++;
}
else{
return false;
}
}
return true;
}
bool isNumber(const char *s) {
beg = 0, end = strlen(s)-1;
while(s[beg] == ' '){
beg++;
}
while(s[end] == ' '){
end--;
}
if(s[beg] == '-' || s[beg] == '+'){
beg++;
}
bool tag = false, dtag = false;
for(int i = beg; i <= end; i++){
if(s[i] == '.'){
if(checkD(s, i)){
if(dtag){
return false;
}
else{
dtag = true;
}
}
else{
return false;
}
}
else if(s[i] == 'e'){
if(checkE(s, i)){
break;
}
else{
return false;
}
}
else if(s[i] >= '0' && s[i] <= '9'){
tag = true;
}
else{
return false;
}
}
return tag;
}
int beg, end;
};
做完去网上找题解,比较好的两种解法:1、正则表达式;2、画状态图。
前者感觉只能是对Java有用,C++里面好像没有正则表达式匹配的函数。感觉画状态图是比较简洁明了的做法。
以下内容转载自:http://discuss.leetcode.com/questions/241/valid-number
Solution:
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
-1, -1, -1, 7, -1, -1, // next states for state 6
-1, 8, -1, 7, -1, -1, // next states for state 7
-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;
}