剑指Offer面试题:表示数值的字符串

该博客讨论如何实现一个函数,用于判断给定的字符串是否表示数值,包括整数和小数。文章列举了数值的合法和非法情况,如不允许‘+-’同时出现、不允许多个小数点、E/e后面不能跟非法字符等。
摘要由CSDN通过智能技术生成

表示数值的字符串

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

分析

  • 对于实例demo分析:典型的数值非法的情况有
    • +-号同时出现,不是第一次出现+-号并且不在E/e之后一个字符
    • 出现多个小数点,出现多个E/e
    • E/e不能是最后一个字符
    • 小数点在E/e之后出现
    • 出现非法字符
public class Solution {
    public static boolean isNumeric(char[] str) {
        boolean havesignal=false; //是否出现了+-号
        boolean haveE=false; //是否出现E/e
        boolean haveRadix=false; //是否出现小数点
        if(str == null || str.length == 0) //边界条件
            return false;

        for(int i=0; i < str.length; i++){
            if(str[i] == 'E' || str[i] == 'e'){
                if(haveE) //不能有多个E/e
                    return false;
                if(i == str.length-1) //E/e不能是最后一个字符
                    return false;
                haveE = true;
            } else if(str[i] == '+' || str[i] == '-'){
                if(havesignal  && (str[i-1] != 'E' && str[i-1] != 'e')) //如果已经出现了符号但是这个+-号不在E/e之后
                    return false;
                if(!havesignal && i > 0 && str[i-1] != 'E' && str[i-1] != 'e')
                    return false;
                havesignal = true;
            } else if(str[i] == '.'){
                if(haveRadix) //不能有多个小数点
                    return false;
                if(haveE) //小数点不能在E/e之后
                    return false;
                haveRadix = true;
            } else if(!(str[i] >= '0' && str[i] <= '9')){
                return false;
            }
        }

        return true;
    }


    public static void main(String[] args){
        String s1 = "+100";
        String s2 = "5e2";
        String s3 = "-123";
        String s4 = "3.14159";
        String s5 = "-1E-16";
        String s6 = "12e";
        String s7 = "1a3.14";
        String s8 = "1.2.3";
        String s9 = "+-5";
        String s10 = "12e+5.4";
        System.out.println("s1 " + isNumeric(s1.toCharArray())); //true
        System.out.println("s2 " + isNumeric(s2.toCharArray())); //true
        System.out.println("s3 " + isNumeric(s3.toCharArray())); //true
        System.out.println("s4 " + isNumeric(s4.toCharArray())); //true
        System.out.println("s5 " + isNumeric(s5.toCharArray())); //true
        System.out.println("s6 " + isNumeric(s6.toCharArray())); //false
        System.out.println("s7 " + isNumeric(s7.toCharArray())); //false
        System.out.println("s8 " + isNumeric(s8.toCharArray())); //false
        System.out.println("s9 " + isNumeric(s9.toCharArray())); //false
        System.out.println("s10 " + isNumeric(s10.toCharArray())); //true
        char[] cs = {'a','b'};
        System.out.println(String.valueOf(cs));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值