1. 程式人生 > >Leetcode個人題解65

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)