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)