首页 > 其他 > 详细

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

时间:2019-10-13 21:43:27      阅读:100      评论:0      收藏:0      [点我收藏+]

题目描述

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

 

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

原文:https://www.cnblogs.com/zzw1024/p/11668181.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!