1. 题目来源
链接:65. 有效数字
2. 题目解析
这题大可不必做!!!实话。
实现 stof()
函数。见代码中注释即可。自己做,不 WA
10 次以上,很难 AC
。
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)
代码:
class Solution {
public:
bool isNumber(string s) {
int l = 0, r = s.size() - 1;
while (l <= r && s[l] == ' ') l ++ ;
while (l <= r && s[r] == ' ') r -- ; // 去除前后空格
if (l > r) return false; // 字符串为空
s = s.substr(l, r - l + 1); // 重新更新去除前后空格的字符串
if (s[0] == '+' || s[0] == '-') s = s.substr(1); // 除去首个符号位
if (s.empty()) return false; // 仅有符号位则出错
// 若首字母为点,且仅有点且后面紧跟 e、E 则错误
if (s[0] == '.' && (s.size() == 1 || s[1] == 'e' || s[1] == 'E')) return false;
int dot = 0, e = 0; // 记录点和 e 出现的次数
for (int i = 0; i < s.size(); i ++ ) {
if (s[i] == '.') {
if (dot > 0 || e > 0) return false; // 点出现过一次,且点在 e 的后面的话则错误
dot ++ ;
} else if (s[i] == 'e' || s[i] == 'E') {
if (!i || i + 1 == s.size() || e > 0) return false; // 如果 e 前面是空,或者后面是空,或者已经出现过 e 则错误
if (s[i + 1] == '+' || s[i + 1] == '-') { // e 后面是正负号的话
if (i + 2 == s.size()) return false; // e 后面只有正负号的话就错误
i ++ ; // 跳过正负号
}
e ++ ; // e 个数加 1
} else if (s[i] < '0' || s[i] > '9') return false; // 最后,如果不是数字就错误
}
return true;
}
};