剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是
2024-08-27 08:38:33
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
最新文章
- nodejs安装和环境部署
- Eclipse自动编译问题
- 关于JavaScript中的创建对象的学习总结
- 山寨版Quartz.Net任务统一调度框架
- PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例
- APK中java代码反编译
- ZOJ 3264 Present for MM
- 用于A*的 二叉堆 AS3实现
- Android添加桌面快捷方式的简单实现
- oldboy第十三天学习
- 【Android纳米学位】project 0 - 问题汇总
- mybatis第一个入门demo
- 《c陷阱与缺陷》笔记--注意边界值
- MySQL入门(下)
- SSH连接不上CentOS 主机配置文件导致的原因的解决方法
- Android -- NestedScrolling滑动机制
- JS-排序详解-冒泡排序
- 下载 Internet Explorer 11(脱机安装程序)
- 洛谷P4088 [USACO18FEB]Slingshot
- python2.0_s12_day10_rabbitMQ使用介绍
热门文章
- ERROR: node with name ";rabbit"; already running on ";localhost";
- Lasso回归的坐标下降法推导
- Git如何永久删除某个重要文件文件或文件夹 (包括历史记录) 强制
- GO --- 将Reader 或者 ReadCloser 转化为 ReadSeeker
- GIS 空间分析案例分析-错误排除经验总结
- R-CNN论文学习
- osg fbx遍历模型节点名称
- osg osgUtil::LineSegmentIntersector
- PAT 甲级 1037 Magic Coupon (25 分) (较简单,贪心)
- (九)会话跟踪技术之Cookie