美文网首页
表示数值的字符串

表示数值的字符串

作者: 凯玲之恋 | 来源:发表于2020-09-20 09:20 被阅读0次

    题目描述

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
    核心: 1) 使用索引之前先检查索引是否越界 2)有效数字只有两种模式:A[.[B]][[e|EC]; .B[e|EC]

    /*
    核心: 有效数字的模式有两种:1)A[.[B]][e|EC]  2).B[e|EC]; 其中,A、C是整数,B是正整数
    有A的话,有没有B都可以
    没有A的话, 必须有B
    */
    class Solution {
        //扫描字符串时的索引
        int i=0;
        public boolean isNumber(String s) {
            //input check
            if(s==null || s.length()==0)
                return false;
            //去掉首尾的空字符
            s = s.trim();
            boolean A = scanInteger(s), B=false, C=false;
            //判断是否有B; 使用索引时要确保索引不越界
            if(i<s.length() && s.charAt(i)=='.'){
                i++;
                B = scanUnsignedInteger(s);
            }
            //判断是否有C
            if(i<s.length() && (s.charAt(i)=='e' || s.charAt(i)=='E')){
                i++;
                C = scanInteger(s);
                //如果存在e|E, 但是没有C, 说明不是数字
                if(C==false)
                    return false;
            }
            //here, 说明C是合格的, 只需判断A和B的情况
            //i必须扫描完整个字符串 && (A合格则B合不合格都可以, A不合格则B必须合格)
            return i==s.length() && (A || B);
            
        }
        private boolean scanInteger(String s){
            if(i<s.length() && (s.charAt(i)=='+' || s.charAt(i)=='-'))
                i++;
            return scanUnsignedInteger(s);
        }
        private boolean scanUnsignedInteger(String s){
            //起始索引
            int start = i;
            while(i<s.length() && s.charAt(i)>='0' && s.charAt(i)<='9'){
                i++;
            }
            //i>start说明扫描到了数字; 
            //i<=start说明没有扫描到数字, 此种情况说明要么start越界, 要么s.charAt(start)不是数字
            return i > start;
        }
    }
    

    参考

    剑指offer面试题20(java版):表示数值的字符串

    相关文章

      网友评论

          本文标题:表示数值的字符串

          本文链接:https://www.haomeiwen.com/subject/nhxyyktx.html