Leetcode Valid Number

OpenSoucre發表於2014-07-03

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.

只需要考慮正負號,小數點,指數e符號,數字四種可能,除了它們之外的字元,程式返回false。

  • 正負號:只能出現在第一個字元或者e後面,不能出現在最後一個字元
  • 小數點:字串不能只含有小數點,也不能只含正負號和小數點,小數點不能在e或者小數點後
  • e:e不能出現在第一個字元,也不能出現在最後一個字元,e前面不能沒有數字,也不能有e
class Solution {
public:
    bool isVaild(char c){
        if(c=='+' || c=='-' || c == '.' || c=='e' || c>='0'&& c <= '9') return true;
        else return false;
        
    }
    
    bool isNumber(const char *s) {
        string str(s);
        bool res = false;
        size_t pos = str.find_first_not_of(" ");
        if(pos!=string::npos) str=str.substr(pos);     //去掉前端空格
        else str="";
        pos = str.find_last_not_of(" ");
        str=str.substr(0,pos+1);  //去掉後端空格
        if(str == "") return res;
        bool hasSign = false, hasDot = false, hasExp = false, hasDigit = false;
        int len = str.length();
        for(int i = 0 ; i < len ;++ i){
            char ch = str[i];
            if(!isVaild(ch)) return false;
            switch(ch){
                case '+':
                case '-':
                    //不在第一個或者e後面;在最後一個字元
                    if((i!=0 && str[i-1]!='e') || i== len-1) return false;
                    else hasSign = true;
                    break;
                case '.':
                    //只有一個字元的情況;只有符號和點;在e和點之後
                    if(len == 1 || (len == 2 && hasSign) || hasExp || hasDot) return false;
                    else hasDot = true;
                    break;
                case 'e':
                    //出現在第一個或最後一個;前面沒有數字;前面有e
                    if(i == 0 || i == len-1 || !hasDigit || hasExp) return false;
                    else hasExp = true;
                    break;
                default:
                    hasDigit = true;
                    break;
            }
        }
        return true;
    }
};

 

相關文章