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

Posted lj-lj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 ;

 

以上是关于剑指offer:表示数值的字符串的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer-表示数值的字符串

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

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

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

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

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