剑指 Offer 20. 表示数值的字符串
模拟,字符串处理
对着规则,if-else判断就好了
复杂度分析:全过程只遍历了一遍字符串,那么时间复杂度为O(n),使用的额外空间位常数,那么空间复杂度为O(1)
class Solution {
public:
bool isNumber(string s) {
int i = 0, j = s.size() - 1;
while(s[i] == ' ') ++i;//首先去掉前后的空格
if(i == s.size()) return false;//排除只有空格的情况
while(s[j] == ' ') --j;
bool num = false;
if(s[i] == '-' || s[i] == '+') ++i;//首先判断e前面的小数或者整数
while(i <= j && isdigit(s[i])){
num = true;//如果字符串没有数字,那么是错的
++i;
}
if(i <= j && s[i] == '.') ++i;
while(i <= j && isdigit(s[i])){
num = true;
++i;
}
if(i <= j && (s[i] == 'E' || s[i] == 'e')){//判断e之后的整数,注意只能是整数
if(i + 1 > j) return false;//1e这种
++i;
if(s[i] == '-' || s[i] == '+'){
++i;
if(i > j) return false;//排除1e+这种
}
while(isdigit(s[i])) ++i;
if(i <= j) return false;//如果没能扫描到最后一个字符,那么是错误的
}
else if(i <= j && !isdigit(s[i]) && s[i] != 'E' && s[i] != 'e'){
return false;//排除1+6这种
}
return num;
}
};