剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是
1 题目描述
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
剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是的更多相关文章
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 剑指Offer - 九度1508 - 把字符串转换成整数
剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...
- 剑指 Offer 58 - II. 左旋转字符串 + 简单题
剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGar ...
- 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串
[算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- 剑指offer(49)把字符串转换成整数。
题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...
- 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)
序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...
- 剑指Offer 52. 正则表达式匹配 (字符串)
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- 【剑指Offer】49、把字符串转换成整数
题目描述: 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字 ...
随机推荐
- centos7 安装 Mysql 5.7.27,详细完整教程
1. 下载 MySQL yum包 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm 2.安装MySQL源 ...
- 使用Redis sorted set实现集合设置member过期
在我们日常工作中,有许多这种逻辑 例如需要得到最近三分钟的cache list. 例如我们监控系统需要查询最近一分钟的数据. 总结说来就是 需要一个list存储对象,并且这个对象会无限制增长,需要设置 ...
- 关于SQLServer 中行列互转的实例说明
这几天在做一个招标系统中审批模块,其中关于报价信息这块,用到了pivot和unpivot来实现数据的行列互转,下面简单介绍一下,实际案例,便于回忆和记录相关的条件下使用的情况.pivot 与 unpi ...
- DELPHI正则表达式
DELPHI正则表达式 1)下载源码 官方网站: http://www.regular-expressions.info/delphi.html 直接下载: http://www.regula ...
- protobuf protocol-buffers 序列化数据 gobs pickling string XML 用C实现的cPickle比pickle快1000倍 protobuf2 protobuf3 差异
场景: 浏览器请求--->python数据生成--->python-生成excel--->浏览器下载excel 目标: 重构为 浏览器请求--->python数据生成---&g ...
- 解决Mac OS编译安装时出现 cannot find openssl's <evp.h> 错误的问题
踩坑 最近通过pecl安装mongodb扩展时,提示以下错误 ...... configure: error: Cannot find OpenSSL's <evp.h> ...... 根 ...
- angular绑定数据
Angular 中使用{{}}绑定业务逻辑里面定义的数据 <h1> Welcome to {{ title }}! /*引入title*/ </h1> export class ...
- Quartz.Net 学习随手记之03 配置文件
第一种方式:直接写入代码中 NameValueCollection properties = new NameValueCollection(); properties["quartz.sc ...
- osg object AnimationPathCallback
osg::ref_ptr<osg::Node> OSG_Qt_::operateMatrix() { osg::ref_ptr<osg::Group> group = new ...
- bat命令编写大全
bat命令编写大全 摘自:https://blog.csdn.net/haibo19981/article/details/52161653 2016年08月09日 12:26:31 爱睡觉的猫L 阅 ...