(剑指Offer)面试题54:表示数值的字符串

题目:

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

但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路:

表示数值的字符串遵循如下模式:

[sign]integral-digits[.[fractional-digit]][e|E[sign]exponential-digits]

说明一下:在数值之前可能有正负符号'+',‘-’,接下来是若干0-9的数位表示数值的整数部分(在某些小数里可能没有整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干0到9的数位表示数值的小数部分,如果数值用科学计数法表示,接下来是一个‘e’或‘E’,以及紧跟着一个整数(可以有正负号)表示指数。

判断一个字符串是否满足上述模式,首先看第一个字符是否为正负符号,如果是在字符串往前移动一个字符,继续扫描字符串剩下中0-9的位数,如果是一个小数,则将遇到小数点,如果是科学计数法,在整数或者小数后面可能会遇到‘e’或‘E’.

代码:

#include <iostream>
#include <string.h>using namespace std;void scanDigits(char** string){while(**string!='\0' && **string>='0' && **string<='9')++(*string);
}bool isExponential(char** string){if(**string!='e' && **string!='E')return false;++(*string);if(**string=='+' || **string=='-')++(*string);if(**string=='\0')return false;scanDigits(string);return (**string=='\0')?true:false;
}bool isNumeric(char* string){if(string==NULL)return false;if(*string=='+' || *string=='-')++string;if(*string=='\0')return false;bool numeric=true;scanDigits(&string);if(*string!='\0'){if(*string=='.'){++string;scanDigits(&string);if(*string=='e' || *string=='E')numeric=isExponential(&string);}else if(*string=='e' || *string=='E')numeric=isExponential(&string);elsenumeric=false;}return numeric && *string=='\0';
}int main()
{cout << isNumeric("5e2") << endl;cout << isNumeric("12e") << endl;cout << isNumeric("1a3.14") << endl;cout << isNumeric("+-5") << endl;return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/6f8c901d091949a5837e24bb82a731f2?rp=3

AC代码:

class Solution {
public:bool isNumeric(char* string){if(string==NULL)return false;int len=strlen(string);int index=0;if(string[index]=='+' || string[index]=='-')++index;if(index>=len)return false;bool numeric=true;scanDigit(string,index);if(index<len){if(string[index]=='.'){++index;scanDigit(string,index);if(index>=len)numeric=true;else if(string[index]=='e' || string[index]=='E')numeric=isExponential(string,index);elsenumeric=false;}else if(string[index]=='e' || string[index]=='E')numeric=isExponential(string,index);elsenumeric=false;}return numeric;      }void scanDigit(char* string,int& index){while(string[index]!='\0' && string[index]>='0' && string[index]<='9')++index;}bool isExponential(char* string,int index){if(string[index]!='e' && string[index]!='E')return false;++index;if(string[index]=='+' || string[index]=='-')++index;if(string[index]=='\0')return false;scanDigit(string,index);return (string[index]=='\0')?true:false;}};

  

转载于:https://www.cnblogs.com/AndyJee/p/4700611.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Loopback Address

ping 127.0.0.1 是你本地的回环地址&#xff01; 实际上只要是127.0.0.1到127.255.255.255都是回环地址&#xff01;都是可以PING检查的&#xff01; 它能ping通&#xff0c;说明你的TCP/IP协议栈没问题&#xff01;如果有问题&#xff0c;你就得检查TCP/IP协议栈&#xff0c;或…

[react] Consumer向上找不到Provider的时候怎么办?

[react] Consumer向上找不到Provider的时候怎么办&#xff1f; 当consumer向上层找不到provider时&#xff0c;此时就会取创建context时传给createContext的那个值&#xff0c;也就是当前context对象的默认值&#xff0c;在定义provider时的value中的值不是默认值&#xff0c;…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…

赵丽词汇速记5500幻星笔记 (0、1)

赵丽词汇速记<5500>幻星笔记00-1开场白自我介绍http://teacherzhaoli.nease.net/上课要求:需要准备一个笔记本able adj.enable v.ability n.如何记笔记&#xff1a;把笔记打成三格单词中文助记方法搜索引擎&#xff1a;赵丽词汇词汇重要性词汇当先1.阅读离不开单…

matlab 数据是否符合正态分布的判断方法

一、问题描述 给定序列X(x1,x2,x3,...,xn)&#xff0c;判断是否该数据序列X符合正态分布。 二、方法 常见已知分布的检验方法&#xff1a;kstest、jbtest、lillietest、chi2gof等&#xff0c;这里使用使用Lilliefors检验进行描述。 语法&#xff1a; 1&#xff1a;h lillie…

什么是CIF/4CIF/QCIF/D1?

From: http://www.c-ps.net/trade/content/2008/8/8009.html QCIF全称Quarter common intermediate format。QCIF是常用的标准化图像格式。在H.323协议簇中&#xff0c;规定了视频采集设备的标准采集分辨率。QCIF 176144像素。 CIF是常用的标准化图像格式&#xff08;Commo…

字符串string和内存流MemoryStream及比特数组byte[]互转

定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 (1)byte[] btSystem.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] btConvert.FromBase64String("字符串"); 2.字符串转流 (1)MemoryStream msnew MemoryStream(System.Text.…

Lwip使用经验

LWIP使用经验 一 LWIP内存管理 数据包管理 设置内存大小 宏编译开关 二 LWIP启动时序 三 LWIP运行逻辑 接收数据包 SequentialAPI函数调用 四 TCPIP核心知识点 滑动窗口 三次握手 断开连接 TCP状态转换 同时打开 同时关闭 五正确使用LWIP 六 LWIP常见问题 网卡驱动程序 内存…

Keil5 编译生成bin二进制文件的设置方法

勾选&#xff1a;After Build/Rebuild Run #1 代码&#xff1a;fromelf --bin .\output\node.axf --output .\output\NoiseApp.bin 解释&#xff1a; .\ 指当前工程文件.uvprojx所在的目录.\output\node.axf 表示给定axf所在的位置.\output\NoiseApp.bin 表示bin文件输出的…

数据库三大范式详解

引言数据库的设计范式是数据库设计所需要满足的规范&#xff0c;满足这些规范的数据库是简洁的、结构明晰的&#xff0c;同时&#xff0c;不会发生插入&#xff08;insert&#xff09;、删除&#xff08;delete&#xff09;和更新&#xff08;update&#xff09;操作异常。反之…

安防监控系统CIF、D1等格式的解释

From: http://blog.sina.com.cn/s/blog_5df7d82d0100ppox.html 在目前国内监控行业中&#xff0c;涉及视频采集卡、压缩卡、硬盘录像机&#xff08;DVR&#xff09;等产品时&#xff0c;经常会遇到诸如SIF、CIF、4CIF、D1等等分辨率标准名词。而在实际上&#xff0c;由于安防行…

[react] 有使用过Consumer吗

[react] 有使用过Consumer吗 Consumer主要用来在使用context的过程中&#xff0c;来获取上层provider的值&#xff0c;通过定义组件contextType的值来指定要获取的是哪个context&#xff0c;找到当前context对应的最近的一个provider&#xff0c;取到value属性的值&#xff0c…

查看线程CPU利用率

查看线程CPU利用率 方法1:利用ps命令查看对应的线程 1. ps -ef | grep 进程名称 2. ps -mp 进程ID -o THREAD,pid,tid,cmd,time,%cpu,%mem 3.1. gdb 3.2. attach 进程ID 3.3. info threads 3.4. thread 线程ID 3.5. bt等操作 3.6. detach 方法2:利用top命令…

linux USB驱动

http://blog.csdn.net/zqixiao_09/article/details/50984074

在word中插入代码段的方法[转]

废话不多说&#xff0c;下面说明实现步骤 步骤一 1.打开这个代码高亮工具网站&#xff1a;http://www.planetb.ca/syntax-highlight-word 2.在代码框中粘贴代码&#xff0c;选择语言&#xff0c;点击Show Highlighted 3.复制生成的代码段 步骤二 4.在 Microsoft Word…

开源好用的思维导图软件XMind

作为一款免费开源的思维导图制作编辑软件&#xff0c;灵活的运用思维导图会让你在学习和工作上帮助甚大。 接下来我们除了介绍思维导图之外&#xff0c;还给大家介绍一款免费的思维导图制作软件 XMind&#xff0c;它能支持 Windows、Mac、Linux 主流操作系统&#xff0c;而且还…

vc++6.0 模拟鼠标点击代码 木马程序的编写 VC 模拟键盘输入

From: http://fengqing888.blog.163.com/blog/static/33011416201112124481/ MFC 工程 把以下代码放到你想要响应的函数里面就行 CPoint pt; GetCursorPos(&pt);//获取鼠标在屏幕的当前位置 SetCursorPos(100,200);//移动到某点坐标 mouse_event(MOUSEEVENTF_RIGHTDO…

[react] 你有用过React的插槽(Portals)吗?怎么用?

[react] 你有用过React的插槽(Portals)吗&#xff1f;怎么用&#xff1f; 1、首先简单的介绍下react中的插槽&#xff08;Portals&#xff09;&#xff0c;通过ReactDOM.createPortal(child, container)创建&#xff0c;是ReactDOM提供的接口&#xff0c;可以实现将子节点渲染…

STM32到GD32移植攻略

1、 系统 1) 晶振起振区别 描述&#xff1a;启动时间&#xff0c;GD32 与STM32 启动时间都是2ms&#xff0c;实际上GD 的执行效率快&#xff0c;所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms&#xff0c;但是这个宏定义值在GD 上时间就更加短了&#xff0c;所以要加大…

安装SQL2005提示“SQL Server 2005 COM+ 目录要求”警告 解决方法

From: http://blog.csdn.net/yaday/article/details/4099223 SQL Server 2005 COM 目录要求警告 ①。启动Distributed Transaction Coordinator 服务 打开服务&#xff0c;在服务中找到Distributed Transaction Coordinator服务&#xff0c;选择“属性”&#xff1b; …