题目:

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.


解题思路:这是一道很无聊的题,只要明确了规则就可以通过。leetcode上这道题的通过率只有10+%,我认为是由于规则不清晰引起的。我也是在不断的错误中明确了“有效”的具体规则定义以后才通过的。


代码:

class Solution {
public:
    bool isNumber(const char *s) {
        bool num_begin=false,e_begin=false,dot=false,last_space=false,dot_exist=false,e_exist=false,dot_before=false,dot_after=false,zf_begin=false;
        if(s==nullptr)return false;
        while(*s!='\0'){
            if(isalpha(*s)){
                if(!num_begin||*s!='e'){
                    return false;
                }
                if(*s=='e'){
                    if(e_begin||zf_begin||e_exist){
                        return false;
                    }else{
                        if(dot&&!dot_before)return false;
                        e_begin=true;
                        e_exist=true;
                        dot=false;
                        s++;
                        continue;
                    }
                }
            }
            if(isspace(*s)){
                if(!num_begin){
                    s++;
                    continue;
                }else{
                    last_space=true;
                    s++;
                    continue;
                }
            }
            if(isdigit(*s)){
                if(!dot_exist){
                    dot_before=true;
                }else{
                    dot_after=true;
                }
                num_begin=true;
                if(last_space)return false;
                if(dot){
                    dot=false;
                    s++;
                    continue;
                }
                if(e_begin){
                    e_begin=false;
                    s++;
                    continue;
                }
                if(zf_begin){
                    zf_begin=false;
                    s++;
                    continue;
                }
                s++;
                continue;
            }
            if(!isalnum(*s)&&!isspace(*s)){
                if(!dot&&*s=='.'&&!e_begin&&!dot_exist&&!e_exist){
                    if(last_space)return false;
                    dot=true;
                    dot_exist=true;
                    num_begin=true;
                    zf_begin=false;
                    s++;
                    continue;
                }else if(e_begin&&(*s=='-'||*s=='+')){
                    e_begin=false;
                    zf_begin=true;
                    s++;
                    continue;
                }else if(!num_begin&&(*s=='-'||*s=='+')){
                    num_begin=true;
                    zf_begin=true;
                    s++;
                    continue;
                }else{
                    return false;
                }
            }
            s++;
        }
        if(num_begin&&!e_begin&&(dot_before||dot_after)&&!zf_begin){
            return true;
        }else{
            return false;
        }
    }
};