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

news/2024/6/29 14:26:55

题目:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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;}};

  


http://lihuaxi.xjx100.cn/news/244662.html

相关文章

CCAH-CCA-500-4题:Where are Hadoop task log files stored?

4.Where are Hadoop task log files stored?For each YARN job, the Hadoop framework generates task log file. Where are Hadoop task log files stored?A.Cached by the NodeManager managing the job containers, then written to a log directory on the NameNodeB.Cac…

表白这件事,比解 bug 要难多少?

情人节快乐&#xff01;我是可爱无敌的阿里妹。 今天是个粉红色日子&#xff0c;我们来聊聊和技术无关的“技术活”&#xff0c;比如&#xff1a; “如何表白&#xff1f;” 当技术人碰上动心的姑娘&#xff0c;他的浪漫开关就打开了。 在代码王国里劈荆斩刺的王子&#xff0c;…

Java面试题及答案整理(2022最新版) 持续更新

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~博主已将这些面试题整理到一个网站上&#xff0c;每天更新 Java 面试题&#xff0c;目前有 1万多道 Java 高频面试题。 本套Java面试题大全&am…

nodejs原生模块简介

一、Express框架 前面的章节已经介绍过了&#xff0c;可以使用npm来安装node.js模块。具体操作请参照以前写的nodejs概论。 Express是一个nodejs的web开源框架&#xff0c;用于快速的搭建web项目。其主要集成了web的http服务器的创建、静态文本管理、服务器URL地址请求处理、ge…

python socket编程

python 编写server的步骤&#xff1a;1.第一步是创建socket对象。调用socket构造函数。如&#xff1a;socket socket.socket( family, type )family参数代表地址家族&#xff0c;可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址&#xff0c;AF_UNIX家族用于同一台机器上的…

Java面试题及答案整理(2022年140道)持续更新

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~博主已将这些面试题整理到一个网站上&#xff0c;每天更新 Java 面试题&#xff0c;目前有 1万多道 Java 高频面试题。 本套Java面试题大全&am…

PHPUnit实践三(构建模块化的测试单元)

本系列教程所有的PHPUnit测试基于PHPUnit6.5.9版本&#xff0c;Lumen 5.5框架 目录结构 模块下的目录是符合Lumen的模块结构的如&#xff1a;Controllers、Models、Logics等是Lumen模块目录下的结构目录如果有自己的目录同级分配即可&#xff0c;如我这里的Requests 整体结构 ├…