剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是

1 题目描述

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

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)

 1 class Solution {
 2 public:
 3     int index=0;
 4     bool isNumeric(char* string)
 5     {        
 6         if(!string) return false;
 7         //数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是
 8         //整数(可以有正负号,也可以没有),而B是一个无符号整数
 9         bool flag=scanInteger(string);
10         if(index<strlen(string) && string[index]=='.'){
11             index++;
12             flag=scanUnsignedInteger(string) || flag;//这里用||的原因,.前面后面可以不跟着数字。注:这里flag一定要放在||后面!!
13         }
14         if(index<strlen(string) && (string[index]=='e' || string[index]=='E')){
15             index++;
16             flag=flag && scanInteger(string);//这里用&&的原因,e|E前面后面都必须要有数字
17         }
18         return flag && index==strlen(string);//注:index==strlen(string)一定要加!!反例1a123
19     }
20     bool scanInteger(char* string){//扫描+或-或空起始的0-9的数位,对应A,C
21         if(index<strlen(string) && (string[index]=='+' || string[index]=='-'))
22             index++;
23         return scanUnsignedInteger(string);//true表示存在A或C
24     }
25     bool scanUnsignedInteger(char* string){//扫描0-9的数位,对应B
26         int start=index;
27         while(index<strlen(string) && string[index]>='0' && string[index]<='9')
28             index++;
29         return index>start;//true表示存在B
30     }
31 
32 };
View Code

(2)

 1 //注意表示数值的字符串遵循的规则;
 2 //在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位
 3 //表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
 4 class Solution {
 5 public:
 6     bool isNumeric(char* string)
 7     {
 8         if(string==NULL or *string=='\0')
 9             return false;
10         if(*string=='+'||*string=='-')
11             string++;
12         int dot=0,num=0,nume=0;
13         while(*string != '\0'){
14             if(*string>='0' && *string<='9'){
15                 string++;
16                 num =1;
17             }
18             else if(*string=='.'){
19                 if(dot>0||nume>0)
20                     return false;
21                 string++;
22                 dot = 1;
23             }
24             else if(*string=='e' || *string=='E'){
25                 if(nume>0||num==0)
26                     return false;
27                 string++;
28                 nume++;
29                 if(*string=='+' || *string=='-')
30                     string++;
31                 if(*string=='\0')
32                     return false;
33             }
34             else
35                 return false;
36         }
37         return true;
38     }
39 };
View Code

参考资料

https://blog.csdn.net/fuqiuai/article/details/88198099

https://blog.csdn.net/u012477435/article/details/83351659#_873

posted @ 2019-08-29 12:22  wxwreal  阅读(611)  评论(0编辑  收藏  举报