详细思路
分类讨论,+-只能在首尾或者e下一位,遇到E,只能有一个,前面必须有数字,后面必须也有数字,小数点只能有一个,前面不能有Eclass Solution { public: bool hasE, hasNum, hasFloat; bool isNumber(string& s) { for(int i = 0; i < s.size(); i++) { // 符号位只能在首位或E的后一位 if((s[i] == '-' || s[i] == '+') && (i == 0 || s[i - 1] == 'e' || s[i - 1] == 'E'))continue; else if((s[i] == 'e' || s[i] == 'E') && !hasE && hasNum) { //只存在一个E, 前面必须有数字, 后面也必须有数字 hasE = true; hasNum = false; }else if(s[i] == '.' && !hasFloat && !hasE) { //只存在一个小数点, 不能在E的后面 hasFloat = true; }else if(isdigit(s[i])) { hasNum = true; }else return false; } return hasNum; } };详细思路 正则表达式
class Solution { public: static const regex pattern; bool isNumber(string str) { return regex_match(str, pattern); } }; const regex Solution::pattern((小数)|(整数)|(((小数)|(整数))[eE](整数))); 整数:[+-]?\\d+ 小数:[+-]?((1)|(2)|(3)) 1:\\d+\\. 2:\\d+\\.\\d+ 3:\\.\\d+ 代入之后 class Solution { public: static const regex pattern; bool isNumber(string str) { return regex_match(str, pattern); } }; const regex Solution::pattern("([+-]?((\\d+\\.)|(\\d+\\.\\d+) |(\\.\\d+)))|([+-]?\\d+)|((([+-]?((\\d+\\.)|(\\d+\\.\\d+) |(\\.\\d+)))|([+-]?\\d+))[eE]([+-]?\\d+))"); 踩过的坑 c++ 用正则表达式记得作为类的静态变量或全局变量,避免重复构造的开销,否则会超时