zoukankan      html  css  js  c++  java
  • Leetcode: Valid Number

    Validate if a given string is numeric.
    
    Some examples:
    "0" => true
    " 0.1 " => true
    "abc" => false
    "1 a" => false
    "2e10" => true
    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

    这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。
    对于小数点出现的时候,我们要满足一下这些条件:(1)前面不能有小数点或者‘e’和‘E’;(2)前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。
    对于正负号出现的情况,要满足条件:(1)必须是第一位或者在‘e’和‘E’后一位;(2)不能是最后一位且后一位要是数字或者‘.’ (“+.8”是true的,这里其实结合了小数点正确的判断即小数点前或者后有一个数字)。
    对于‘e’和‘E’的情况,要满足:(1)前面不能有‘e’和‘E’出现过;(2)不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。
    根据上面列举的情况,我们用两个标签和做前后位的判断来实现,算法复杂度比较明显是O(n)的,只需要O(1)的额外空间。代码如下:

    其中最难理解第11行,要这样理解:小数点正确的出现方式是————除了不能有小数点或者‘e’和‘E’之外,前一位或后一位至少有一个数字,说的确切一点是:(前一位是数字&&不是第一位)||(后一位是数字&&不是最后一位)。这里只需要前一位或者后一位是数字就好了,不需要都是,举个例子就是比如".1"是true的。本例是要找出那些小数点错误出现的case来return false,而小数点错误出现的条件就是不满足上面正确出现的条件,所以对上面正确条件取反,进而得到:(是第一位||前一位不是数字)&&(是最后一位||后一位不是数字),这就是小数点错误出现的条件,即 

    (i==0 || !(s.charAt(i-1)>='0' && s.charAt(i-1)<='9')) && (i==s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9'))

    同理,比较难理解的还有18行,还是这样,先写符号位‘+’,‘-’正确出现的方式--------

    (i==0 || s.charAt(i-1)=='e' || s.charAt(i-1)=='E') && i<s.length()-1 && (s.charAt(i+1)>='0' && s.charAt(i+1)<='9' || s.charAt(i+1)=='.')

    那么,先写符号位‘+’,‘-’不正确出现的方式就是取反:

    (i>0 && s.charAt(i-1)!='e' && s.charAt(i-1)!='E') || i==s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9' || s.charAt(i+1)=='.')

    如果嫌自己去获得取反之后的表达式比较麻烦,那么就可以直接加上括号再取反

    比如:小数点的情况 !((i!=0 && (s.charAt(i-1)>='0' && s.charAt(i-1)<='9')) || (i!=s.length()-1 && (s.charAt(i+1)>='0' && s.charAt(i+1)<='9')))

     1 public class Solution {
     2     public boolean isNumber(String s) {
     3         if (s == null) return false;
     4         s = s.trim();
     5         if (s.length() == 0) return false;
     6         boolean dotFlag = false;
     7         boolean eFlag = false;
     8         for (int i=0; i<s.length(); i++) {
     9             switch(s.charAt(i)) {
    10                 case '.': 
    11                     if (dotFlag || eFlag || (i==0 || !(s.charAt(i-1)>='0' && s.charAt(i-1)<='9')) && (i==s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9'))) {
    12                         return false;
    13                     }
    14                     dotFlag = true;
    15                     break;
    16                 case '+':
    17                 case '-':
    18                     if ((i>0 && (s.charAt(i-1)!='e') && s.charAt(i-1)!='E') || i==s.length()-1 || !(s.charAt(i+1)>='0' && s.charAt(i+1)<='9' || s.charAt(i+1)=='.')) {
    19                         return false;
    20                     }
    21                     break;
    22                 case 'E':
    23                 case 'e':
    24                     if (eFlag || i==0 || i==s.length()-1) {
    25                         return false;
    26                     }
    27                     eFlag = true;
    28                     break;
    29                 case '0':
    30                 case '1':
    31                 case '2':
    32                 case '3':
    33                 case '4':
    34                 case '5':
    35                 case '6':
    36                 case '7':
    37                 case '8':
    38                 case '9':
    39                     break;
    40                 default: return false;
    41             }
    42         }
    43         return true;
    44     }
    45 }

     特殊的情况包括“”以及“ ”,都是false的,但是如果我们不特殊处理,程序将会输出true,所以要在开头s.trim()了之后进行一个判断

  • 相关阅读:
    EasyNVR播放HLS协议时ts文件报错404是什么问题?
    【操作步骤】EasyNVR硬件设备如何设置通电不自动启动?
    C#实现QQ接口软件QQ的HTTP接口协议探究
    第一篇随笔
    Extjs继承相关
    Montgomery乘法介绍
    中国商用密码杂凑算法标准SM3算法(数字签名)
    c语言链接动态库dll
    环、商环、整数环
    大数据挖掘技术及应用(复习重点)
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4021977.html
Copyright © 2011-2022 走看看