剑指53.表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
 

思路

思路1:调用库函数。通过调用Double类的转换成Double类型的方法,判断转换的过程当中是否抛出异常即可。

            用Double.parseDouble()是把字符串变成double类型。
            如果要变成int,则用Integer.parseInt()

 

思路2:模拟法。可以从正面考虑也可以从反面考虑,具体见代码。难点在于归纳所有的正确情况或者错误情况。

 

思路3:使用正则表达式。

 

☆解法1

public class Solution {
    public boolean isNumeric(char[] str) {
        //String s = String.valueOf(str);
        String s = new String(str);
        // 要单独处理,例如输入 "959.94f" 不会抛出异常 
        if (s.endsWith("f") || s.endsWith("d")|| s.endsWith("F")|| s.endsWith("D"))
            return false;
        try {
            Double.parseDouble(s);
        }catch (Exception e){
            return false;
        }
        return true;
    }
}

 

解法2.1(考虑反面情况,只能通过牛客)

public class Solution {
    public boolean isNumeric(char[] str) {
        if (str == null || str.length == 0)
            return false;
        // 标记符号,小数点,e是否出现过
        boolean sign = false, decimal = false, hasE = false;
        for (int i = 0; i < str.length; i++) {
            if (str[i] == 'e' || str[i] == 'E'){
                if (i == 0 || i == str.length - 1) return false; // e不能位于首位和末尾
                if (str[i - 1] == '.') return false; // e不能直接在小数点后面
                if (hasE) return false; // 只能出现1个e
                hasE = true;

            }else if (str[i] == '+' || str[i] == '-'){
                if (!sign && i != 0 && str[i-1] != 'e' && str[i-1] != 'E') return false;  // 符号第一次出现必须在首位或者E后边
                if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false;   // 符号第二次出现必须在e后边
                sign = true;

            }else if (str[i] == '.'){
                if (hasE || decimal) return false; // E后边不能有小数,并且小数点只能出现一次
                if (i == str.length - 1) return false; // 小数点不能出现在最后一位
                decimal = true;

            }else if (str[i] < '0' || str[i] > '9'){ // 不合法字符
                return false;
            }
        }
        return true;
    }
}

 

☆☆解法2.2(考虑正面情况,牛客力扣均能AC)

public class Solution {
    public boolean isNumeric(char[] str) {
        if (str == null || str.length == 0)
            return false;
        // 标记是否遇到数位、小数点、‘e’或'E'
        boolean numFlag = false,dotFlag = false, eFlag = false;
        for (int i = 0; i < str.length; i++) {
            // 判定为数字
            if (str[i] >= '0' && str[i] <= '9'){
                numFlag = true;
                // 判定为.  需要没出现过.并且没出现过e
            }else if (str[i] == '.' && !dotFlag && !eFlag){
                dotFlag = true;
                // 判定为e 需要没出现过e,并且出现过数字了
            }else if ((str[i] == 'e' || str[i] == 'E') && !eFlag && numFlag){
                eFlag = true;
                numFlag = false; //重置isNum,因为‘e’或'E'之后也必须接上整数,防止出现 123e或者123e+的非法情况
                // 判定为+-符号 只能出现在第一位或者紧跟e后面
            }else if ((str[i] == '+' || str[i] == '-') && (i == 0 || str[i-1] == 'e' || str[i-1] == 'E')){

            }else { // 其他情况都是非法的
                return false;
            }
        }
        return numFlag;
    }
}

 

解法3

Mark

 

 

posted @ 2020-09-03 14:55  不学无墅_NKer  阅读(143)  评论(0编辑  收藏  举报