美文网首页剑指offer的java实现-数据结构与算法
剑指offer第二版-20.表示数字的字符串

剑指offer第二版-20.表示数字的字符串

作者: ryderchan | 来源:发表于2017-07-14 09:12 被阅读159次

    本系列导航:剑指offer(第二版)java实现导航帖

    面试题20:表示数值的字符串

    题目要求:
    判断一个字符串是否表示数值,如+100,5e2,-123,-1E-16都是,12e,1e3.14,+-5,1.2.3,12e+5.4都不是。
    提示:表示数值的字符串遵循模式A[.[B]][e|EC] 或者 .B[e|EC];A,B,C表示整数,|表示或。[]表示可有可无。

    解题思路:
    此题也没有没什么特殊思路,就按照A[.[B]][e|EC] 或者 .B[e|EC];A,B,C这两种模式匹配下即可。

    package chapter3;
    /**
     * Created by ryder on 2017/7/13.
     * 表示数值的字符串
     */
    public class P127_NumberStrings {
        public static boolean isNumeric(String str){
            //正确的形式:A[.[B]][e|EC] 或者 .B[e|EC];
            if(str==null||str.length()==0)
                return false;
            int index;
            if(str.charAt(0)!='.'){
                index = scanInteger(str,0);
                if(index==-1)
                    return false;
                if(index==str.length())
                    return true;
                if(str.charAt(index)=='.'){
                    if(index==str.length()-1)
                        return true;
                    index = scanInteger(str,index+1);
                    if(index==str.length())
                        return true;
                }
                if(str.charAt(index)=='e'||str.charAt(index)=='E'){
                    index = scanInteger(str,index+1);
                    if(index==str.length())
                        return true;
                    else
                        return false;
                }
                return false;
            }
            else{
                index = scanInteger(str,1);
                if(index==-1)
                    return false;
                if(index==str.length())
                    return true;
                if(str.charAt(index)=='e'||str.charAt(index)=='E'){
                    index = scanInteger(str,index+1);
                    if(index==str.length())
                        return true;
                }
                return false;
    
            }
    
        }
        public static int scanInteger(String str,Integer index){
            if(index>=str.length())
                return -1;
            if(str.charAt(index)=='+'||str.charAt(index)=='-')
                return scanUnsignedInteger(str,index+1);
            else
                return scanUnsignedInteger(str,index);
        }
        public static int scanUnsignedInteger(String str,Integer index){
            int origin = index;
            while(str.charAt(index)>='0'&&str.charAt(index)<='9'){
                index++;
                if(index==str.length())
                    return index;
            }
            if(origin==index)
                index = -1;
            return index;
        }
        public static void main(String[] args){
            System.out.println(isNumeric("+100"));//true
            System.out.println(isNumeric("5e2")); //true
            System.out.println(isNumeric("-123"));//true
            System.out.println(isNumeric("3.1416"));//true
            System.out.println(isNumeric("-1E-16"));//true
            System.out.println(isNumeric(".6"));//true
            System.out.println(isNumeric("6."));//true
            System.out.println(isNumeric("12e"));//false
            System.out.println(isNumeric("1a3.14"));//false
            System.out.println(isNumeric("1.2.3"));//false
            System.out.println(isNumeric("+-5"));//false
            System.out.println(isNumeric("12e+5.4"));//false
        }
    }
    

    运行结果

    true
    true
    false
    false
    

    相关文章

      网友评论

        本文标题:剑指offer第二版-20.表示数字的字符串

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