由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题。

题意:判断字符串是否是一个合法的数字

定义有符号的数字是(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 = ;
for (; isspace(s[m]); m++);
int n = s.size() - ;
for (; isspace(s[n]); n--);
if (m == s.size()) s = "";
else s = string(s.begin() + m, s.begin() + n + );
int hasdot = s.find(".",);
int hase = s.find_first_of("eE", hasdot == string::npos ? : hasdot); if (hasdot != string::npos && hase != string::npos){//有小数点和e
if (isSignNumber(string(s.begin(), s.begin() + hasdot))){
return isNumber(string(s.begin() + hasdot + , s.begin() + hase), ) && isSignNumber(string(s.begin() + hase+, s.end()));
}
else if (isUnsignNumber(string(s.begin() + hasdot + , s.begin() + hase))){
return isNumber(string(s.begin(), s.begin() + hasdot), ) && isSignNumber(string(s.begin() + hase + , 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 + , s.end()), );
}
else if (isUnsignNumber(string(s.begin() + hasdot + , s.end()))){
return isNumber(string(s.begin(), s.begin() + hasdot), );
}
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 + , s.end()));
}
else return isSignNumber(string(s.begin() + hase + , s.end()));//没有e的 }
bool isNumber(string s, int type){
switch (type)
{
case :
if (s == "+" || s == "-" || s == "") return true;
return isSignNumber(s);
break;
case :
if (s == "") return true;
return isUnsignNumber(string(s.begin(), s.end()));
break;
default:
return false;
break;
}
} bool isSignNumber(string s){
if (s.size() == ) return false;
if (s[] == '+' || s[] == '-') s = string(s.begin() + , s.end());
return isUnsignNumber(s);
}
bool isUnsignNumber(string s){
if (s.size() == ) return false;
for (string::size_type i = ; i < s.size(); ++i){
if (!isdigit(s[i])) return false;
}
return true;
}
};

最新文章

  1. 本周psp
  2. 转-HttpClient4.3 连接管理
  3. angular手势事件之on-Hold
  4. ASP.NET Web Api 实现数据的分页(转载)
  5. Java中String类的方法及说明
  6. Linux录屏软件
  7. Apache shiro之身份验证(登陆)流程
  8. Docker Centos安装Openssh
  9. shell grep 高亮
  10. maven 部署到tomcat 的 resource问题
  11. sql server 2008数据复制方法
  12. gdi+ 高速绘制透明窗体
  13. Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012
  14. CentOS7 emacs安装
  15. Redis 密码设置和登录
  16. mysql关联模糊查询他表字段
  17. Python学习之旅(十九)
  18. EF和LINQ 调用存储过程
  19. 安装xml2js出现npm ERR! code E404 npm ERR! 404 Not Found: event-stream@3.3.6
  20. 从零开始的全栈工程师——html篇1.7

热门文章

  1. java利用jxl操作Excel
  2. vagrant 安装使用 win7
  3. error C2065: &#39;INVALID_SET_FILE_POINTER&#39; : undeclared identifier
  4. document.referrer 特性
  5. 团队作业week2
  6. 校验两次密码一致的js代码
  7. 【半平面交】bzoj1038 [ZJOI2008]瞭望塔
  8. 一些gem的简要翻译(欢迎提出问题共同讨论)
  9. 【转】Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么保持正常运行
  10. JS判断手机访问跳转到手机站