zoukankan      html  css  js  c++  java
  • 65. 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.

     The general solution would be to check each char in turn 
    and report the first char that makes the string a non number. 
    There are some exceptions to watch out for: 
    The 1st char can be '-' 
    First occurence of '.' denotes a decimal. Subsequent 
    occurences mean that string is not a number

    L: 认为.5是错的, +.5 或-.5, 或 57. 需讨论   00.1是否是valid , is ther any scientific notation?

    public static boolean isNumber(String s) {
        //s = s.trim();
        if (s == null || s.length() == 0) {
          return false;
        }
          
        boolean pointSeen = false;
        //boolean eSeen = false;
        boolean numberSeen = false;
        //boolean numberAfterE = true;
        for(int i=0; i<s.length(); i++) {
            if('0' <= s.charAt(i) && s.charAt(i) <= '9') {
                numberSeen = true;
                //numberAfterE = true;
            } else if(s.charAt(i) == '.') {
                if((i == 0 )|| i == s.length() - 1 || pointSeen || (s.charAt(i - 1) == '-') ||  (s.charAt(i - 1) == '+')){
                    return false;
                }
                pointSeen = true;
           
            } else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
                if(i != 0) {
                    return false;
                }
            } else {
                return false;
            }
        }
          
        return numberSeen;
    }
      public static void main(String[] args) {
        String s = "+0.5";
          System.out.print(isNumber("0.1"));
     
         
      }
    

      

      

    这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘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,而小数点错误出现的条件就是不满足上面正确出现的条件,所以对上面正确条件取反,进而得到:(是第一位||前一位不是数字)&&(是最后一位||后一位不是数字),这就是小数点错误出现的条件,即 

     linkedin: may no  scientific notation

    public boolean isNumber(String s) {
        s = s.trim();
        
        boolean pointSeen = false;
        boolean eSeen = false;
        boolean numberSeen = false;
        boolean numberAfterE = true;
        for(int i=0; i<s.length(); i++) {
            if('0' <= s.charAt(i) && s.charAt(i) <= '9') {
                numberSeen = true;
                numberAfterE = true;
            } else if(s.charAt(i) == '.') {
                if(eSeen || pointSeen) {
                    return false;
                }
                pointSeen = true;
            } else if(s.charAt(i) == 'e') {
                if(eSeen || !numberSeen) {
                    return false;
                }
                numberAfterE = false;
                eSeen = true;
            } else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
                if(i != 0 && s.charAt(i-1) != 'e') {
                    return false;
                }
            } else {
                return false;
            }
        }
        
        return numberSeen && numberAfterE;
    }
    

      

  • 相关阅读:
    响应式设计
    小视频-上传视频
    美多商城项目总结
    jwt 接口加密
    flask入门小方法
    flask的继承和包含
    flask中的宏
    flask的jinja2模板中过过滤器的相关小内容
    flask中的简单的前端写入
    flask的cookie和session的简单原理
  • 原文地址:https://www.cnblogs.com/apanda009/p/7824682.html
Copyright © 2011-2022 走看看