剑指Offer20 表示数值的字符串

表示数值的字符串

【题目】:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串**"+100",“5e2”,"-123",“3.1416"和”-1E-16"**都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

思路

考察的是:模式匹配的策略

代码的完整性

我们首先分析一下子可能是数值的字符串的格式

在数值之前可能有一个表示正负的’-‘或者’+’。
接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。
如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。
表示数值的字符串遵循模式 A[.[B]][e|EC]或者.B[e|EC]

代码

package C字符串;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/2/19 0019  19:07
 * 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
 * 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
 * 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
 *
 * 表示数值的字符串遵循模式 A[.[B]][e|EC]或者.B[e|EC]
 * 其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着`e`或者`E`为数值的指数部分
 *
 * 上述A和C都可以是以`+’或者‘-’开头的0~9的数位串;B也是0~9的数位串,但前面不能有正负号
 *
 *判断一个字符串是否符合上述模式时,
 * 首先应该尽可能多的扫描0~9的数位(有可能在起始处`+`或者`-`),也就是前面模式中表示数值整数的A部分
 *
 * 如果遇到小数点`.`,则开始扫描表示数值小数部分的B部分。
 *
 * 如果遇到`e`或者`E`,则开始扫描C部分
 *
 *
 *
 *
 */
public class Problem2 {

    public static void main(String[] args) {



    }

    public boolean isNumeric(char[] str) {
        if (null==str || str.length == 0)
            return false;

        //记录当前扫描字符的位置,因为要进行方法传参,所以用类类型;不用数字也可以,直接采用index即可
        int[] index = new int[]{0};

        // 记录是否满足条件
        boolean isNumberic = false;

        // 判断 A
        isNumberic = isInteger(str,index);

        /**
         * 判断 . B
         * A  A.  A.B 均符合条件
         */
        if (index[0]<str.length && str[index[0]]=='.'){
            index[0]++;
            isNumberic = isUnsignedInteger(str,index) || isNumberic;//注意这里为什么要取值为||
        }

        // 判断 e C ,E 后面必须有数字
        if (index[0]<str.length && (str[index[0]]=='e' || str[index[0]]=='E')){
            index[0]++;
            isNumberic = isInteger(str,index) && isNumberic;//注意这里取值为&&;为什么取ee
        }

        if (isNumberic && index[0] == str.length){
            return true;
        }else {
            return false;
        }
        
        

    }

    // 判断输入的字符串是否包含一个无符号整数
    private boolean isUnsignedInteger(char[] str,int[] index){
        int start = index[0];
        while (index[0]<str.length && str[index[0]]>='0' && str[index[0]]<='9' ){
            index[0]++;
        }
        if (index[0] > start){
            return true;
        }else {
            return false;
        }
    }

    // 判断输入的是否包含一个数字
    private boolean isInteger(char[] str,int[] index){
        if (index[0]<str.length && (str[index[0]]=='-' || str[index[0]]=='+')){
            index[0]++;
        }
        return isUnsignedInteger(str,index);
    }






    }






发布了151 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ZHOUJIAN_TANK/article/details/104399255