分析
1.找到字符串中字符’e’或者’E’第一次出现的位置。
2.如果存在字符’e’或者’E’第一次出现的位置,那么可以将字符串分为两部分进行检查是否合法,
‘e‘或者’E’之前的部分可以是整数或者小数,'e’或者’E’之后的部分必须是整数。
3.如果字符’e’和字符’E’都没有出现过,则整个字符串可以是整数,也可以是小数。
4.判断是否是合格的整数或者小数
4.1 正负号只能出现在开头。
4.2 如果要求不一定是整数,字符'.'最多出现一次;如果要求一定是整数,字符'.'不能出现。
4.3 字符串中至少有一个数字。
## 代码
class Solution {
public:
//solve函数的作用是判断某个字符串是否为合法的数字,s为字符串,must_int标记是否一定是整数
//注意:这里的形参s必须要有const修饰
bool solve(const string& s, bool must_int) {
//e前面部分为空、e后面部分为空以及整个字符串为空
if (s.empty()) return false;
//判断第一个字符是否为正负号,如果是,则从下标为1的字符开始遍历;如果不是,则从下标为0的字符开始遍历
int st = int(s[0] == '+' || s[0] == '-');
//has_dot标记是否出现过小数点,has_digit标记是否出现过阿拉伯数字
bool has_dot = false, has_digit = false;
//开始遍历每一个字符
for (int i = st; i < s.size(); i++) {
//如果当前字符是小数点
if (s[i] == '.') {
//如果要求一定是整数,则不可以出现小数点;
if (must_int) return false;
//如果之前已经出现过小数点,也是false
if (has_dot) return false;
has_dot = true;
} else if (isdigit(s[i])) {
has_digit = 1;
} else {
//除了数字和小数点的其他情况,只能是false
return false;
}
}
//如果出现过阿拉伯数字,则返回true;否则返回false
return has_digit;
}
bool isNumber(string s) {
int e_idx = s.find('e');//字符'e'第一次出现的下标
int E_idx = s.find('E');//字符'E'第一次出现的下标
if (e_idx != string::npos)
return solve(s.substr(0, e_idx), false) && solve(s.substr(e_idx + 1), true);
if (E_idx != string::npos)
return solve(s.substr(0, E_idx), false) && solve(s.substr(E_idx + 1), true);
return solve(s, false);
}
};