首页 > 代码库 > leetcode第一刷_Valid Number

leetcode第一刷_Valid Number

又是那种看上去非常简单,但非常难过的问题,主要是所有的测试用例很难考虑全面。下面我列举出所有的情况:

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;
    }
};