Leetcode個人題解65

LEETCODE專題


65. Valid Number

題目要求:
這裏寫圖片描述

這裏題目要求我們判斷一個字符串到底是不是一個數字。


問題:其實這道題歸根結底只有一個亟待解決的問題,所以這裏筆者偷個懶就不用數字列表了。這個最大的問題就是是不是一個數字的標準是什麼。

分析:正如題目所說的一樣,題目的例子給的是非常的含糊的,所以我們要做的事情就是丟進測試裏去試一試,然後得到一些合法數字的標準。所以這道題考的就是耐心(-_-!)
通過慘痛的測試之後,筆者發現合法數字的標準可以分爲以下幾個方面來闡述:

  1. 數字,合法數字的首要標準就是要有數字。
  2. 小數點,合法數字可以含有小數點。
  3. 指數,合法數字可以含有指數。諸如9e11和7.5e18,但是血與淚的教訓告訴我們,千萬不要在指數e後面加含有小數點的數字。這裏賊坑。(當然不信邪的可以試一下)。
  4. 符號,底數部分和指數部分的開頭都可以含有1個符號’+’或’-‘。
  5. 空格,數字的兩邊可以含有空格。

知道了這幾方面後,我們就可以寫出代碼了。


class Solution {
public:
    bool isDigit(char a) {
        return a >= '0' && a <= '9';
    }

    bool isExponent(char a) {
        return a == 'e' || a == 'E';
    }

    bool isSpace(char a) {
        return a == ' ' || a == '\t';
    }

    bool isDot(char a) {
        return a == '.';
    }

    bool isSign(char a) {
        return a == '+' || a == '-';
    }

    bool isNumber(string s) {
        int index = -1;

        bool first = true;
        bool end = false;

        // record if it has num, dot or exponent
        bool hasAnyNum = false;
        bool hasNum = false;
        bool hasDot = false;
        bool hasExponent = false;

        // record the last char
        bool num = false;
        bool exponent = false;
        bool space = false;
        bool dot = false;
        bool sign = false;
        while (++index < s.length()) {
            if (first) {
                if (isSpace(s[index])) {
                    space = true;
                    num = exponent = dot = sign = false;
                } else if (isDigit(s[index])) {
                    if (hasAnyNum) return false;
                    first = exponent = space = dot = sign = false;
                    hasNum = num = true;
                } else if (isExponent(s[index])) {
                    return false;
                } else if (isDot(s[index])) {
                    if (hasAnyNum) return false;
                    hasDot = dot = true;
                    first = exponent = space = num = sign = false;
                } else if (isSign(s[index])) {
                    if (hasAnyNum) return false;
                    sign = true;
                    first = num = exponent = space = dot = false;
                } else {
                    return false;
                }
            } else {
                if (isSpace(s[index])) {
                    if (num || dot) {
                        if (hasNum == false) return false;
                        hasNum = hasDot = hasExponent = num = exponent = dot = sign = false;
                        first = hasAnyNum = space = true;
                    } else {
                        return false;
                    }
                } else if (isDigit(s[index])) {
                    if (hasNum == false) hasNum = true;
                    num = true;
                    exponent = space = dot = sign = false;
                } else if (isExponent(s[index])) {
                    if (hasExponent) return false;
                    if (num || (dot && hasNum)) {
                        hasExponent = exponent = true;
                        num = space = dot = sign = false;
                    } else {
                        return false;
                    }
                } else if (isDot(s[index])) {
                    if (hasExponent || hasDot || dot || exponent) return false;
                    hasDot = dot = true;
                    num = exponent = space = sign = false;
                } else if (isSign(s[index])) {
                    if (exponent) {
                        sign = true;
                        num = exponent = space = dot = false;
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        }

        index--;
        if (isDigit(s[index]) || isDot(s[index])) {
            return hasNum;
        } else if (isSpace(s[index])) {
            return hasAnyNum;
        }
        return false;
    }
};

時間複雜度:O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章