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

  • 相关阅读:
    Java的“Goto”与标签
    Integer和int使用==比较的总结
    20175301李锦然《网络对抗技术》Exp9 Web安全基础
    20175301李锦然《网络对抗技术》Exp8 Web基础
    20175301李锦然《网络对抗技术》Exp7 网络欺诈防范
    2019-2020-2 20175301李锦然《网络对抗技术》Exp6 MSF基础应用
    2019-2020-2 20175301李锦然《网络对抗技术》Exp5 信息搜集与漏洞扫描
    2019-2020-2 20175301李锦然《网络对抗技术》Exp4 恶意代码分析
    2019-2020-2 20175301李锦然《网络对抗技术》Exp3 免杀原理与实践
    2019-2020-2 20175301李锦然《网络对抗技术》Exp2 后门原理与实践
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13605798.html
Copyright © 2011-2022 走看看