剑指offer第53题——表示数值的字符串

题目:

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

这个题的难点在哪里?就是要我们对于数值类字符串有一个清晰的了解:

比如,+,-号出现的位置,.出现的位置,E出现的位置。

先看别人的代码:

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

分析其思路:

首先判断第一个字符是不是+,-号,之后依此对数字,小数点,字符e(E)进行判定。他的判顶规则是:

小数点最多只能有一个,且只能出现在字符e(E)的前面!

字符e也只能有一个,且其前面必须要有数字,最后补了一个e后面如果只有+,-没有数字,那么是错误的。

也就是全程让数字判断,小数点判断,和字母e判断各司其职。这样程序的思路是非常清晰的!!!

而我之前的想法是:

从第一个字母到最后一个字母,判断字符的前后位置关系是否正确。并且区分了一个字符,两个字符,三个字符,多个字符的情况,显然基于这种分类分思想是错误的!!!而基于特殊字符的位置信息,是正确的,我们只需要对特殊字符进行判定即可。

posted @ 2020-03-27 11:37  少年π  阅读(185)  评论(0编辑  收藏  举报