1 题目描述

  请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

2 思路和方法

  (1)表示数值的字符串遵循模式 A[.[B]][e|EC] 或者.[B][e|EC] ,其中A为数值的整数部分,B为小数点后数值的小数部分,C紧跟着’e’和’E’为数值的指数部分。注:小数点前可以有数字也可以没有数字。

    将整个过程分为三个步骤

    1)先扫描数值的整数部分;首先取首位的符号,扫描整数部分A

    2)如果遇到小数点’.’,开始扫描小数部分B

    3)如果遇到’e’和’E’,开始扫描直属部分C

  (2)注意表示数值的字符串遵循的规则;在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位,表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。

3 C++核心代码

(1)

 class Solution {
public:
int index=;
bool isNumeric(char* string)
{
if(!string) return false;
//数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是
//整数(可以有正负号,也可以没有),而B是一个无符号整数
bool flag=scanInteger(string);
if(index<strlen(string) && string[index]=='.'){
index++;
flag=scanUnsignedInteger(string) || flag;//这里用||的原因,.前面后面可以不跟着数字。注:这里flag一定要放在||后面!!
}
if(index<strlen(string) && (string[index]=='e' || string[index]=='E')){
index++;
flag=flag && scanInteger(string);//这里用&&的原因,e|E前面后面都必须要有数字
}
return flag && index==strlen(string);//注:index==strlen(string)一定要加!!反例1a123
}
bool scanInteger(char* string){//扫描+或-或空起始的0-9的数位,对应A,C
if(index<strlen(string) && (string[index]=='+' || string[index]=='-'))
index++;
return scanUnsignedInteger(string);//true表示存在A或C
}
bool scanUnsignedInteger(char* string){//扫描0-9的数位,对应B
int start=index;
while(index<strlen(string) && string[index]>='' && string[index]<='')
index++;
return index>start;//true表示存在B
} };

(2)

 //注意表示数值的字符串遵循的规则;
//在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位
//表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
class Solution {
public:
bool isNumeric(char* string)
{
if(string==NULL or *string=='\0')
return false;
if(*string=='+'||*string=='-')
string++;
int dot=,num=,nume=;
while(*string != '\0'){
if(*string>='' && *string<=''){
string++;
num =;
}
else if(*string=='.'){
if(dot>||nume>)
return false;
string++;
dot = ;
}
else if(*string=='e' || *string=='E'){
if(nume>||num==)
return false;
string++;
nume++;
if(*string=='+' || *string=='-')
string++;
if(*string=='\0')
return false;
}
else
return false;
}
return true;
}
};

参考资料

https://blog.csdn.net/fuqiuai/article/details/88198099

https://blog.csdn.net/u012477435/article/details/83351659#_873

最新文章

  1. nodejs安装和环境部署
  2. Eclipse自动编译问题
  3. 关于JavaScript中的创建对象的学习总结
  4. 山寨版Quartz.Net任务统一调度框架
  5. PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例
  6. APK中java代码反编译
  7. ZOJ 3264 Present for MM
  8. 用于A*的 二叉堆 AS3实现
  9. Android添加桌面快捷方式的简单实现
  10. oldboy第十三天学习
  11. 【Android纳米学位】project 0 - 问题汇总
  12. mybatis第一个入门demo
  13. 《c陷阱与缺陷》笔记--注意边界值
  14. MySQL入门(下)
  15. SSH连接不上CentOS 主机配置文件导致的原因的解决方法
  16. Android -- NestedScrolling滑动机制
  17. JS-排序详解-冒泡排序
  18. 下载 Internet Explorer 11(脱机安装程序)
  19. 洛谷P4088 [USACO18FEB]Slingshot
  20. python2.0_s12_day10_rabbitMQ使用介绍

热门文章

  1. ERROR: node with name &quot;rabbit&quot; already running on &quot;localhost&quot;
  2. Lasso回归的坐标下降法推导
  3. Git如何永久删除某个重要文件文件或文件夹 (包括历史记录) 强制
  4. GO --- 将Reader 或者 ReadCloser 转化为 ReadSeeker
  5. GIS 空间分析案例分析-错误排除经验总结
  6. R-CNN论文学习
  7. osg fbx遍历模型节点名称
  8. osg osgUtil::LineSegmentIntersector
  9. PAT 甲级 1037 Magic Coupon (25 分) (较简单,贪心)
  10. (九)会话跟踪技术之Cookie