Validate if a given string is numeric.
Some examples:
"0"
=>true
" 0.1 "
=>true
"abc"
=>false
"1 a"
=>false
"2e10"
=>true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
这个题目是我在LeetCode上遇到的最闹心的题目,这个题目没有给出合法数字的定义,我们要做的就是不断地测试,直到处理所有的情况为止。
我的C++代码如下:
bool isNumber(string s) {
s.erase(0, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
s.erase(0, s.find_first_not_of("+"));
s.erase(0, s.find_first_not_of("-"));
if (s[0] == 'e' || s[s.size() - 1] == 'e') return false;
if (s[0] == '.' && s[1] == 'e') return false;
bool isFloat = false;
bool isScientific = false;
bool lastIsE = false;
for (auto c : s) {
if (lastIsE) {
lastIsE = false;
if (c != '+' && c != '-' && (c < '0' || c > '9')) return false;
}
else if (c == '.') {
if (isFloat || isScientific) return false;
isFloat = true;
}
else if (c == 'e') {
if (isScientific) return false;
isScientific = true;
lastIsE = true;
}
else if (c < '0' || c > '9')
return false;
}
if (s[s.size() - 1] == '+' || s[s.size() - 1] == '-') return false;
if (s.size() == 1 && (isFloat || isScientific)) return false;
return s.empty() ? false : true;
}
时间性能如下图所示: