菜鸡

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);
    }
};