博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(剑指Offer)面试题54:表示数值的字符串
阅读量:6500 次
发布时间:2019-06-24

本文共 3160 字,大约阅读时间需要 10 分钟。

题目:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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 
#include
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); else numeric=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) numeric=true; else if(string[index]=='e' || string[index]=='E') numeric=isExponential(string,index); else numeric=false; } else if(string[index]=='e' || string[index]=='E') numeric=isExponential(string,index); else numeric=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://pdvyo.baihongyu.com/

你可能感兴趣的文章
IBM X系列手提 成功安装MAC OS 并实现IPhone真机调试 教程
查看>>
httpContext.Current.Session[值] 取值的问题
查看>>
ogre场景图与场景内容分离
查看>>
《分析服务从入门到精通读书笔记》第一章、代理键和渐变维度(5)
查看>>
ArchLinux安装笔记(续)(桌面篇)
查看>>
中断小笔记
查看>>
C#委托、事件、消息(入门级)
查看>>
求连续子数组的最大和
查看>>
五、何为Debug(调试版)和Release(发行版)
查看>>
python设置windows桌面壁纸
查看>>
Visual Studio 11 Beta新特性(一):安装VS11
查看>>
通信常用概念
查看>>
Oracle.start with … connect by [… and] prior…order siblings by …
查看>>
PreferenceFragment 使用 小结
查看>>
stringstream 使用方法
查看>>
FreeBinary 格式说明
查看>>
oracle相关链接
查看>>
有关奇葩的mex编程时的matlab出现栈内存错误的问题
查看>>
表的复制——sql语句
查看>>
CleanMyMac怎么用(二)之实用工具
查看>>