菜鸡
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return bool布尔型
*/
bool isNumeric(string str) {
if (str.empty()) {
return false;
}
bool flag = false;
int idx = 0;
// 跳过前导空格
while (idx < str.size() && str[idx] == ' ') {
++idx;
}
int las = str.size() - 1;
while (las >= 0 && str[las] == ' ') {
--las;
}
// las指向有效子串的下一位
++las;
// 全是空格
if (idx >= las) {
return false;
}
flag = is_integer(str, idx);
// 小数点和e只能出现一次,用if单次判断
// 点(有的话)比e(有的话)先出现
if (idx < las && str[idx] == '.') {
++idx;
// 小数点之后只能是纯数字,但是可选
flag |= is_numeric(str, idx);
}
if (idx < las && (str[idx] == 'e' || str[idx] == 'E')) {
++idx;
// e后面必须是数字(符号位可选)
flag &= is_integer(str, idx);
}
// 遍历完有效子串到达末尾则证明只有一项有效子串 后续没有以其他符号分割的内容
// 该子串是否有效由flag判定
return flag && (idx == las);
}
private:
// 有符号整数
bool is_integer(std::string &s, int &idx) {
// 前导符号可选
if (idx < s.size() && (s[idx] == '+' || s[idx] == '-')) {
++idx;
}
return is_numeric(s, idx);
}
// 无符号整数
bool is_numeric(std::string &s, int &idx) {
int tmp = idx;
// 前导0排除 (暂时没实现)
// if (idx < s.size() && s[idx] == '0') {
// return false;
// }
while (idx < s.size() && s[idx] >= '0' && s[idx] <= '9') {
++idx;
}
return idx > tmp;
}
};
使用正则表达
#include <regex>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return bool布尔型
*/
bool isNumeric(string str) {
std::string pattern = R"((\s)*[-+]?((\.\d+)|(\d+\.?(\d+)?))([Ee][+-]?\d+)?\s*)";
std::regex reg(pattern);
return std::regex_match(str, reg);
}
};