zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    MySQL安装失败,提示需安装MicroSoft Visual C++ 2013 Redistributable
    Selinium登录系统cookies的重复使用
    脚本绕开验证码,自动执行的方法
    Firebug显示停用状态
    web自动化测试中绕开验证码登陆的方式
    java使用poi包将数据写入Excel表格
    读取config配置
    定位元素的等待方法
    jxl读取Excel表格数据
    php中的魔术常量
  • 原文地址:https://www.cnblogs.com/cane/p/3901521.html
Copyright © 2011-2022 走看看