又是那種看上去非常簡單,但非常難過的問題,主要是所有的測試案例很難考慮全面。下面我列舉出所有的情況:
1. 字串前面是可以含有空格的,但是全部都是空格是不行的。
2. 一個數字開頭可以是哪些字元呢?很容易想到的是“+”和“-”,但是別忘記還有小數點。
3. 一個數字中間也是可以含有字元的,比如科學計數法的“e”,而且e之後是可以接“+”或者“-”的。但是要注意e是不是作為數位開頭或者結尾的。
4. 一個數位結尾可以由空格,但必須全是空格,不能再接其他的字元。
5. 一個數字中“e”的個數不能多於一個,小數點也最多一個,小數點可以作為數子的結尾但是不能作為開頭。
寫的亂七八糟的。這種題目應該先想清楚測試案例再寫,而不是看到測試案例再修改代碼,血的教訓啊。
bool isNum(char a){ if(a>='0' && a<='9') return true; return false;}class Solution {public: bool isNumber(const char *s) { if(s[0] == '\0') return false; int start = 0; while(s[start] == ' ') start++; if(s[start] == '\0') return false; if(s[start] == '+' || s[start] == '-'){ if(!isNum(s[start+1])&&!(s[start+1]=='.'&&isNum(s[start+2]))) return false; else start++; } bool point = false; bool pe = false; for(int i=start;s[i]!='\0';i++){ if(isNum(s[i])) continue; if(s[i] == ' '){ while(s[i] == ' ') i++; if(s[i] != '\0') return false; else return true; } if(s[i] == '.'&&!point&&((i>0&&s[i+1]=='e')||isNum(s[i+1])||(i>0&&isNum(s[i-1])))){ point = true; continue; } else if(s[i] == 'e'&&!pe&&i>0&&(isNum(s[i-1])||s[i-1]=='.')){ if(!isNum(s[i+1])&&((s[i+1] == '+'||s[i+1] == '-')&&isNum(s[i+2]))) i++; else if(!isNum(s[i+1])) return false; pe = true; point = true; continue; }else return false; } return true; }};