剑指offer——22表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
 
题解:
  表示数值的字符串遵循模式A[[B]][elEC]或者.B[elEC],其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着e'或者E’为数值的指数部分。在小数里可能没有数值的整数部分。例如,小数.123等于0.123。

因此A部分不是必需的。如果一个数没有整数部分,那么它的小数部分不能为空。

  

 1 class Solution {
 2 public:
 3     bool isNumeric(char* string)
 4     {
 5         if (string == nullptr)return false;
 6 
 7         bool numeric = scanInteger(&string);
 8 
 9         // 如果出现'.',接下来是数字的小数部分
10         if (*string == '.')
11         {
12             ++string;
13 
14             // 下面一行代码用||的原因:
15             // 1. 小数可以没有整数部分,例如.123等于0.123;
16             // 2. 小数点后面可以没有数字,例如233.等于233.0;
17             // 3. 当然小数点前面和后面可以有数字,例如233.666
18             numeric = scanUnsignedInteger(&string) || numeric;
19         }
20 
21         // 如果出现'e'或者'E',接下来跟着的是数字的指数部分
22         if (*string == 'e' || *string == 'E')
23         {
24             ++string;
25 
26             // 下面一行代码用&&的原因:
27             // 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
28             // 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4
29             numeric = numeric && scanInteger(&string);
30         }
31 
32         return numeric && *string == '\0';
33     }
34 
35     bool scanUnsignedInteger(char** str)
36     {
37         const char* before = *str;
38         while (**str != '\0' && **str >= '0' && **str <= '9')
39             ++(*str);
40 
41         // 当str中存在若干0-9的数字时,返回true
42         return *str > before;
43     }
44 
45     // 整数的格式可以用[+|-]B表示, 其中B为无符号整数
46     bool scanInteger(char** str)
47     {
48         if (**str == '+' || **str == '-')
49             ++(*str);
50         return scanUnsignedInteger(str);
51     }
52 };

 

posted @ 2019-10-13 20:29  自由之翼Az  阅读(129)  评论(0编辑  收藏  举报