/* 分情况讨论 */ classSolution { public: boolisNumber(string s){ if (s.empty()) returnfalse; int i = 0; while (i < s.size() && s[i] == ' ') i ++; int j = s.size() - 1; while (j >= 0 && s[j] == ' ') j --; if (i > j) returnfalse; s = s.substr(i, j - i + 1);
bool hasSign = false, hasDot = false, hasE = false, hasNum = false; // 正负号/小数点/e/数字 int length = s.size(); for (int i = 0; i < length; i ++) { if (s[i] >= '0' && s[i] <= '9') hasNum = true; elseif (s[i] == 'e' || s[i] == 'E') { if (!hasNum) returnfalse; // e前面没有数字 if (hasE) returnfalse; // 只能有一个e if (i == length - 1) returnfalse; // e后面必须有数字,如 12e hasE = true; } elseif (s[i] == '+' || s[i] == '-') { // 第一次出现符号,并且不在开头,需要在e/E之后,如 12e+5 if (!hasSign && i > 0 && s[i - 1] != 'e' && s[i - 1] != 'E') returnfalse; // 第二次出现符号,需要在e/E之后,如 +5e-6 if (hasSign && s[i - 1] != 'e' && s[i - 1] != 'E') returnfalse; if (i == length - 1) returnfalse; hasSign = true; } elseif (s[i] == '.') { if (hasDot) returnfalse; // 小数点不能出现两次 if (hasE) returnfalse; // E后面不能跟小数点,如 12e+4.3 if (i == length - 1 && !hasNum) returnfalse; // E前面没有数字 hasDot = true; } elsereturnfalse; // 不合法字符 } returntrue; } };