题目:

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

  

最新文章

  1. [LintCode] Maximum Subarray 最大子数组
  2. 完美 全兼容 解决 文字两端对齐 justify 中文姓名对齐
  3. 利用crontab系统每天定时备份MySQL数据库
  4. 屠龙之路_转角遇到服务器大魔王_FourthDay
  5. light oj 1422 Halloween Costumes (区间dp)
  6. JBuilder链接sql server数据库
  7. HDU 2795 单点更新,区间优先查找(想法)
  8. 『重构--改善既有代码的设计』读书笔记----Inline Method
  9. java集合框架01
  10. Mono For Android中简单实现按钮的动画效果
  11. call和apply方法的理解
  12. [转]Numpy使用MKL库提升计算性能
  13. Django(一)入门基础——hello world
  14. SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作
  15. 手动安装sublime text3 文本编辑器是控制台
  16. java中的JSON数据转换方法fastjson
  17. 个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 2
  18. PLSQL Developer连接Oracle
  19. Android Studio连接不到MuMu模拟器;
  20. 1、list 的一些相关操作 2、增删改查 3、tuple 的操作 4、range

热门文章

  1. Linux修复文件系统
  2. linux-ARM的几个使用指令
  3. Unity 游戏开发技巧集锦之材质的应用的创建反射材质
  4. WP SyntaxHighlighter 初探
  5. noip历届 &amp;&amp; 打代码常犯错误总结
  6. BZOJ1975 SDOI2010魔法猪学院
  7. NOIP2018之前
  8. Navicat连接Docker中的mysql报错:client does not support authentication
  9. 【转】_CrtSetBreakAlloc 内存泄漏
  10. 2349 Arctic Network(中文版)