剑指offer:表示数值的字符串

题目描述:

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

 

思路分析:

1. 第一种思路,是对于这种数值表示形式的特殊情况进行分析,这里一共包括了四种情况,需要设定三个数值来对于符号位的出现,小数点的出现以及e值的出现进行记录。分别使用布尔类型的三个变量:sign,dot,hasE。接下来分析四种特殊情况:

  1)对于符号位'+'和'-'的出现的判断:只能出现在字符串的第一位或e/E的后面第一位。

  2)对于e/E的出现判断:不能出现两次或出现在字符串的最后一位。

  3)对于'.'的出现判断:不能出现两次,不能出现在字符串的最后一位,不能出现的e/E之后。

  4)对于其他字符,只要不是0到9的数字就出错。

根据上述的特殊情况,对字符串进行一次遍历,当顺利完成遍历即为满足条件的字符串。

 

2. 第二种思路,是将整个字符串的形式进行了拆分,可以形式化表示为A[.[B]][e|EC],其中A,B,C表示数字,“|”表示或,[]表示可有可无的部分。

在数值之前可能有一个表示正负的'+'或者'-'。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学记数法表示,接下来是一个'e'或者'E',以及紧跟着的一个整数(可以有正负号)表示指数。

这一部分对于字符串的遍历使用了指针,比较灵活,要注意理解p,*p,&p以及**p之间的区别。以及函数调用的过程指针的变化。

 

代码:

思路一:

 1 class Solution {
 2 public:
 3     bool isNumeric(char* string)
 4     {
 5         if(string==nullptr)
 6             return false;
 7         bool sign=false, dot=false, hasE=false;
 8         for(int i=0; i<strlen(string); i++)
 9         {
10             if(string[i]=='+' || string[i]=='-')
11             {
12                 if(!sign && i!=0 && string[i-1]!='e' && string[i-1]!='E')
13                     return false;
14                 else if(sign && string[i-1]!='e' && string[i-1]!='E')
15                     return false;
16                 sign = true;
17             }
18             else if(string[i]=='e' || string[i]=='E')
19             {
20                 if(hasE || strlen(string)-1 == i)
21                     return false;
22                 hasE = true;
23             }
24             else if(string[i] == '.')
25             {
26                 if(dot || strlen(string)-1==i || hasE)
27                     return false;
28                 dot = true;
29             }
30             else if(string[i]>'9' || string[i]<'0')
31                 return false;
32         }
33         return true;
34     }
35 
36 };

 

思路二:

 1 class Solution {
 2 public:
 3     bool isNumeric(char* string)
 4     {
 5         if(*string=='\0' || string==nullptr)
 6             return false;
 7         bool res = true;
 8         if(*string == '+' || *string == '-')
 9             string++;
10         isDigtal(&string);
11         if(*string!='\0')
12         {
13             if(*string == '.')
14             {
15                 string++;
16                 isDigtal(&string);
17                 if(*string == 'e' || *string == 'E')
18                     res = isExponential(&string);
19             }
20             else if(*string == 'e' || *string == 'E')
21                 res = isExponential(&string);
22             else
23                 res = false;
24         }
25         return res && *string=='\0';
26     }
27 
28 private:
29     void isDigtal(char** string)
30     {
31         while(**string !='\0' && **string>='0' && **string<='9')
32         {
33             (*string)++;
34         }
35     }
36     
37     bool isExponential(char** string)
38     {
39         (*string)++;
40         if(**string=='+' || **string=='-')
41             (*string)++;
42         if(**string == '\0')
43             return false;
44         isDigtal(string);
45         return (**string == '\0') ? true : false;
46     }
47 
48 };

 

posted @ 2019-06-28 21:37  Fzu_LJ  阅读(116)  评论(0编辑  收藏  举报