题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
 
 
 
题目分析:首先搞清楚什么样的字符串表示数值。A[.B][e|E C]或者.B[e|E C]
A[.B][e|E C]表示:A代表数值的(带符号)整数部分,[.B]可以没有,但是如果有了'.',则必须要有小数点后点的小数部分B(无符号的数值),指数e|E可以没有,但是有的话,必须后面带(带符号的)数值部分
同理:.B[e|E C], 没有A部分
 
 
 1 class Solution {
 2 private:
 3     bool scanUnsignedInteger(char* &str) {
 4         char* before = str;
 5         while (*str != '\0' && *str >= '0' && *str <= '9') {
 6             str++;
 7         }
 8         return str > before;
 9     }
10     bool scanInteger(char* &str) {
11         if (*str == '+' || *str == '-') {
12             str++;
13         }
14         return scanUnsignedInteger(str);
15     }
16 public:
17     bool isNumeric(char* string)
18     {
19         if (string == nullptr) {
20             return false;
21         }
22         bool numeric = scanInteger(string);
23         // 如果出现'.',则接下来是数字的小数部分
24         if (*string == '.') {
25             string++;
26             // 下面一行用||的原因:
27             // 1.小数可以没有整数部分, 如.123等于0.123
28             // 2.小数点后面可以没有数字,如233.等于233.0
29             // 3.小数点前面和后面都可以有数字,如233.666
30             numeric = scanUnsignedInteger(string) || numeric; //只有当小数点前后都没有数字的时候,numeric = false;
31         }
32         if (*string == 'e' || *string == 'E') {
33             string++;
34             // 用&&的原因:
35             // 1.当e或者E前面没有数字的时候,整个字符串不能表示数字,如.e1, e1;
36             // 2.当e或者E后面没有整数的时候,整个字符串不能表示数字,如12e、12e+5.4
37             numeric = numeric && scanInteger(string); 
38         }
39         return numeric && *string == '\0';
40     }
41 };

 

越努力,越幸运