Leetcode 65 Valid Number 字符串处理

由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题。

题意:判断字符串是否是一个合法的数字

定义有符号的数字是(n),无符号的数字是(un),有符号的兼容无符号的

合法的数字只有下列几种组合:(其中E可以大写)

有小数点和e

(n).(un)e(n)

.(un)e(n)

(n).e(n)

仅仅有小数点的

(n).(un)

.(un)

(n).

仅仅有e的

(n)e(n)

没有e的

(n)

只要分别判断这上面的8种情况就能得到正确的答案

更好的解法其实是一种叫做有限状态机的解法,下次再说这题的时候会有介绍

class Solution {
public:
    bool isNumber(string s) {
        int m = 0;
        for (; isspace(s[m]); m++);
        int n = s.size() - 1;
        for (; isspace(s[n]); n--);
        if (m == s.size()) s = "";
        else s = string(s.begin() + m, s.begin() + n + 1);
        int hasdot = s.find(".",0);
        int hase = s.find_first_of("eE", hasdot == string::npos ? 0 : hasdot);

        if (hasdot != string::npos && hase != string::npos){//有小数点和e
            if (isSignNumber(string(s.begin(), s.begin() + hasdot))){
                return  isNumber(string(s.begin() + hasdot + 1, s.begin() + hase), 1) && isSignNumber(string(s.begin() + hase+1, s.end()));
            }
            else if (isUnsignNumber(string(s.begin() + hasdot + 1, s.begin() + hase))){
                return  isNumber(string(s.begin(), s.begin() + hasdot), 0) && isSignNumber(string(s.begin() + hase + 1, s.end()));
            }
            else return false;
        } 
        else if (hasdot != string::npos && hase == string::npos){//仅仅有小数点的
            if (isSignNumber(string(s.begin(), s.begin() + hasdot))){
                return  isNumber(string(s.begin() + hasdot + 1, s.end()), 1);
            }
            else if (isUnsignNumber(string(s.begin() + hasdot + 1, s.end()))){
                return  isNumber(string(s.begin(), s.begin() + hasdot), 0);
            }
            else return false;
        }
        else if (hasdot == string::npos && hase != string::npos){//仅仅有e的
            return isSignNumber(string(s.begin(), s.begin() + hase)) && isSignNumber(string(s.begin() + hase + 1, s.end()));
        }
        else return isSignNumber(string(s.begin() + hase + 1, s.end()));//没有e的
        
    }
    bool isNumber(string s, int type){
        switch (type)
        {
        case 0:
            if (s == "+" || s == "-" || s == "")  return true;
            return isSignNumber(s);
            break;
        case 1:
            if (s == "")  return true;
            return isUnsignNumber(string(s.begin(), s.end()));
            break;
        default:
            return false;
            break;
        }
    }

    bool isSignNumber(string s){
        if (s.size() == 0) return false;
        if (s[0] == '+' || s[0] == '-') s = string(s.begin() + 1, s.end());
        return isUnsignNumber(s);
    }
    bool isUnsignNumber(string s){
        if (s.size() == 0) return false;
        for (string::size_type i = 0; i < s.size(); ++i){
            if (!isdigit(s[i])) return false;
        }
        return true;
    }
};
原文地址:https://www.cnblogs.com/onlyac/p/5464798.html