LeetCode--Valid Number

这道题真心是难度比较大,不是算法难度,是实现难度,

各种case都得考虑到。

我没有A过,一开始就把.1这种case当做是错误的。导致程序逻辑乱套了。

下面是别人的代码:

 1 class Solution {
 2 public:
 3     bool isNumber(const char *s) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         if (s == NULL)
 7             return false;
 8             
 9         while(isspace(*s))
10             s++;
11             
12         if (*s == '+' || *s == '-')
13             s++;
14             
15         bool eAppear = false;
16         bool dotAppear = false;
17         bool firstPart = false;
18         bool secondPart = false;
19         bool spaceAppear = false;
20         while(*s != '')
21         {
22             if (*s == '.')
23             {
24                 if (dotAppear || eAppear || spaceAppear)
25                     return false;
26                 else
27                     dotAppear = true;
28             }
29             else if (*s == 'e' || *s == 'E')
30             {
31                 if (eAppear || !firstPart || spaceAppear)
32                     return false;
33                 else
34                     eAppear = true;
35             }
36             else if (isdigit(*s))
37             {
38                 if (spaceAppear)
39                     return false;
40                     
41                 if (!eAppear)
42                     firstPart = true;
43                 else
44                     secondPart = true;
45             }
46             else if (*s == '+' || *s == '-')
47             {
48                 if (sapceAppear)
49                     return false;
50                     
51                 if (!eAppear || !(*(s-1) == 'e' || *(s-1) == 'E'))
52                     return false;
53             }
54             else if (isspace(*s))
55                 spaceAppear = true;
56             else
57                 return false;
58                 
59             s++;            
60         }
61         
62         if (!firstPart)
63             return false;
64         else if (eAppear && !secondPart)
65             return false;
66         else
67             return true;
68     }
69 };

下面是我自己没A过的代码:

本来想是先处理首尾空格,然后对处理后的字符判断;

判断完初步合法以后就判断小数点和e的位置分成两半分别处理判断。

leetcode对于:“+.8”这种case是认为是对的

 1 class Solution {
 2 public:
 3     bool isNumber(const char *s) {
 4         string str(s);
 5         if(str == "")
 6             return true;
 7         int i = 0;
 8         int j = str.length()-1;
 9         while(isspace(str[i]))
10         {
11             ++i;
12         }
13         while(isspace(str[j]))
14             --j;
15         str = str.substr(i,j-i+1);
16         if(str == "")
17             return false;
18         if(str.length() == 1 && !isdigit(str[0]))
19             return false;
20         if(!isdigit(str[str.length()-1]) && str[str.length()-1] != '.')
21             return false;
22         if(!isdigit(str[0]) && str[0] != '+' && str[0] != '-' && str[0] != '.')
23             return false;
24         return isNumber_1(str);
25     }
26     //这个输入保证首尾都是合法的,并且是非空的
27     bool isNumber_1(string s)
28     {
29         int i = 0;
30         bool isE = false;
31         for(; i < s.length() ; ++i)
32         {
33             if(s[i] == '.' || s[i] == 'e' || s[i] == 'E')
34             {
35                 if(s[i] != '.')
36                     isE = true;
37                 break;
38             }
39         }
40         string leftpart = s.substr(0,i);
41         if(!isNumber_2(leftpart))
42             return false;
43         string rightpart;
44         if(i+1 >= s.length())
45             rightpart = "";
46         else
47             rightpart = s.substr(i+1,s.length()-i);
48         if(rightpart == "")
49             return true;
50         if(!isE)
51         {
52             if(!isdigit(s[i+1]))
53                 return false;
54         }
55         return isNumber_2(rightpart);
56     }
57     bool isNumber_2(string s)
58     {
59         if(s == "")
60             return true;
61         if(s[0] == '+' || s[0] == '-')
62         {
63             return isNumber_3(s.substr(1,s.length()-1));
64         }
65         else if(!isdigit(s[0]))
66         {
67             return false;
68         }
69         return isNumber_3(s);
70     }
71     bool isNumber_3(string s)
72     {
73         if(s == "")
74             return false;
75         int i=0;
76         while(i < s.length())
77         {
78             if(!isdigit(s[i]))
79                 return false;
80             ++i;
81         }
82         return true;
83     }
84 };
原文地址:https://www.cnblogs.com/cane/p/3901521.html