题意
验证一个字符串是否为数字
思路
可能会出现的情况:
- 前导空格和后缀空格
- 字符串存在多个小数点或者多个 e 或者存在其他字母
- 小数点前面没有数字,这种情况是
true -
e
前面没有数字,这种情况是
false -
e
或者小数点后面没有数字是
false
代码
class Solution {
public:
bool isNumber(string s) {
int len = s.length() - 1;
int flag = 0;
int cnt = 0;
int loc = 0;
//去除前导空格和后缀空格
while(len >= 0 && s[len] == ' ') len--;
while(loc <= len && s[loc] == ' ') loc++;
//去除多个字母和多个e
for(int i = loc; i <= len; i++){
if(s[i] >= 'a' && s[i] <= 'z'){
if(s[i] =='e'){
cnt++;
} else{
flag = 1;
break;
}
}
}
if(flag) return false;
cnt = 0;
//去除多个小数点
for(int i = loc; i <= len; i++){
if(s[i] == '.'){
cnt++;
}
}
if(cnt > 1) return false;
if(s[loc] == '+' || s[loc] == '-') loc++;
//检查前面是否存在数字和小数点
cnt = 0;
while(loc <= len && ((s[loc] >= '0' && s[loc] <= '9') || s[loc] == '.')){
if(s[loc] != '.')
cnt++;
loc++;
}
if(cnt < 1) return false;
if(s[loc] == 'e'){
loc++;
if(s[loc] == '+' || s[loc] =='-') loc++;
cnt = 0;
//检查e后面是否含有数字
while(loc <= len && s[loc] >= '0' && s[loc] <= '9') {
cnt++;
loc++;
}
if(cnt < 1) return false;
}
return loc > len;
}
};