首页 > 代码库 > LeetCode--Valid Number

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 != \0)21         {22             if (*s == .)23             {24                 if (dotAppear || eAppear || spaceAppear)25                     return false;26                 else27                     dotAppear = true;28             }29             else if (*s == e || *s == E)30             {31                 if (eAppear || !firstPart || spaceAppear)32                     return false;33                 else34                     eAppear = true;35             }36             else if (isdigit(*s))37             {38                 if (spaceAppear)39                     return false;40                     41                 if (!eAppear)42                     firstPart = true;43                 else44                     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             else57                 return false;58                 59             s++;            60         }61         62         if (!firstPart)63             return false;64         else if (eAppear && !secondPart)65             return false;66         else67             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         else47             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 };