码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-06-28 22:59:12      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:sdi   solution   特殊情况   设定   代码   exp   one   符号   数位   

题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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:表示数值的字符串

标签:sdi   solution   特殊情况   设定   代码   exp   one   符号   数位   

原文地址:https://www.cnblogs.com/LJ-LJ/p/11104902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!