【模拟】B000_LCjz_表示数值的字符串(模拟+分类讨论)
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是
方法一:模拟
...
class Solution {
public:
bool isSign(char c) { return c=='+'||c=='-'; }
bool is_e_or_E(char c) { return c=='e'||c=='E'; }
bool isNumber(string s) {
int n=s.size(), i=0;
while (i<n && s[i]==' ') i++;
if (s=="") return false;
bool hasDig=false, hasSign=false, has_e_or_E=false, hasDot=false;
while (i<n) {
char c=s[i];
if (isdigit(c)) {
hasDig=1;
}else if (isSign(c)) {
if (hasSign || hasDig || hasDot) return false;
hasSign=1;
}else if (is_e_or_E(c)) {
if (has_e_or_E || !hasDig) return false;
has_e_or_E=1, hasDig=hasSign=hasDot=0; //e/E后面可以跟+/-,而此时+/-号前面如果出现了数字,则需要清除标记,否则会上面的if会误判+/-号前有数字
}else if (c=='.'){
if (hasDot || has_e_or_E) return false;
hasDot=1;
}else if (c==' ') {
break;
}else {
return false;
}
i++;
}
while (i<n && s[i]==' ') i++;
return hasDig && i==n;
}
};
复杂度分析
- Time:\(O(n)\),
- Space:\(O(1)\)