AcWing 31. 表示数值的字符串
原题链接
困难
作者:
RwChen
,
2023-10-11 17:59:51
,
所有人可见
,
阅读 71
表示数值的字符串
case1: 整数
case2: 小数
case3: (整数 or 小数)E(整数)
C++ 代码
class Solution {
bool isInteger(const string& s) {
if (s.empty()) return false;
int i = 0;
if (s[i] == '-' || s[i] == '+') ++i;
if (i >= s.size()) return false; // 至少有一位数字
while (i < s.size()) {
if (!isdigit(s[i])) return false;
++i;
}
return true;
}
bool isDecimal(const string& s) {
if (s.empty()) return false;
int i = 0;
if (s[i] == '-' || s[i] == '+') ++i;
if (i + 2 >= s.size()) return false; // 至少 .x or x.
bool dot = false;
while (i < s.size()) {
if (!isdigit(s[i])) {
if (s[i] != '.' || dot) return false; // 小数中只有小数点且只出现一次
dot = true;
}
++i;
}
return dot; // 必须包含小数点
}
public:
bool isNumber(string s) {
if (isInteger(s) || isDecimal(s)) return true; // a or a.b
const int n = s.size();
for (int i = 1; i < n - 1; ++i) {
if (toupper(s[i]) == 'E') {
auto pre = s.substr(0, i);
auto suf = s.substr(i + 1);
// cout << pre << ' ' << suf << '\n';
// cout << isDecimal(pre) << ' ' << isInteger(suf) << '\n';
if ((isInteger(pre) || isDecimal(pre)) && isInteger(suf)) { // aeb or a.ceb
return true;
}
}
}
return false;
}
};