Leetcode個人題解65
阿新 • • 發佈:2019-02-02
LEETCODE專題
65. Valid Number
題目要求:
這裡題目要求我們判斷一個字串到底是不是一個數字。
問題:其實這道題歸根結底只有一個亟待解決的問題,所以這裡筆者偷個懶就不用數字列表了。這個最大的問題就是是不是一個數字的標準是什麼。
分析:正如題目所說的一樣,題目的例子給的是非常的含糊的,所以我們要做的事情就是丟進測試裡去試一試,然後得到一些合法數字的標準。所以這道題考的就是耐心(-_-!)
通過慘痛的測試之後,筆者發現合法數字的標準可以分為以下幾個方面來闡述:
- 數字,合法數字的首要標準就是要有數字。
- 小數點,合法數字可以含有小數點。
- 指數,合法數字可以含有指數。諸如9e11和7.5e18,但是血與淚的教訓告訴我們,千萬不要在指數e後面加含有小數點的數字。這裡賊坑。(當然不信邪的可以試一下)。
- 符號,底數部分和指數部分的開頭都可以含有1個符號’+’或’-‘。
- 空格,數字的兩邊可以含有空格。
知道了這幾方面後,我們就可以寫出程式碼了。
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)