Leetcode 65 Valid Number 字符串处理
由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题。
题意:判断字符串是否是一个合法的数字
定义有符号的数字是(n),无符号的数字是(un),有符号的兼容无符号的
合法的数字只有下列几种组合:(其中E可以大写)
有小数点和e
(n).(un)e(n)
.(un)e(n)
(n).e(n)
仅仅有小数点的
(n).(un)
.(un)
(n).
仅仅有e的
(n)e(n)
没有e的
(n)
只要分别判断这上面的8种情况就能得到正确的答案
更好的解法其实是一种叫做有限状态机的解法,下次再说这题的时候会有介绍
class Solution { public: bool isNumber(string s) { int m = 0; for (; isspace(s[m]); m++); int n = s.size() - 1; for (; isspace(s[n]); n--); if (m == s.size()) s = ""; else s = string(s.begin() + m, s.begin() + n + 1); int hasdot = s.find(".",0); int hase = s.find_first_of("eE", hasdot == string::npos ? 0 : hasdot); if (hasdot != string::npos && hase != string::npos){//有小数点和e if (isSignNumber(string(s.begin(), s.begin() + hasdot))){ return isNumber(string(s.begin() + hasdot + 1, s.begin() + hase), 1) && isSignNumber(string(s.begin() + hase+1, s.end())); } else if (isUnsignNumber(string(s.begin() + hasdot + 1, s.begin() + hase))){ return isNumber(string(s.begin(), s.begin() + hasdot), 0) && isSignNumber(string(s.begin() + hase + 1, s.end())); } else return false; } else if (hasdot != string::npos && hase == string::npos){//仅仅有小数点的 if (isSignNumber(string(s.begin(), s.begin() + hasdot))){ return isNumber(string(s.begin() + hasdot + 1, s.end()), 1); } else if (isUnsignNumber(string(s.begin() + hasdot + 1, s.end()))){ return isNumber(string(s.begin(), s.begin() + hasdot), 0); } else return false; } else if (hasdot == string::npos && hase != string::npos){//仅仅有e的 return isSignNumber(string(s.begin(), s.begin() + hase)) && isSignNumber(string(s.begin() + hase + 1, s.end())); } else return isSignNumber(string(s.begin() + hase + 1, s.end()));//没有e的 } bool isNumber(string s, int type){ switch (type) { case 0: if (s == "+" || s == "-" || s == "") return true; return isSignNumber(s); break; case 1: if (s == "") return true; return isUnsignNumber(string(s.begin(), s.end())); break; default: return false; break; } } bool isSignNumber(string s){ if (s.size() == 0) return false; if (s[0] == '+' || s[0] == '-') s = string(s.begin() + 1, s.end()); return isUnsignNumber(s); } bool isUnsignNumber(string s){ if (s.size() == 0) return false; for (string::size_type i = 0; i < s.size(); ++i){ if (!isdigit(s[i])) return false; } return true; } };