剑指Offer之表示数值的字符串、Java实现

每日一道编程题之表示数值的字符串

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

输入:

+100
-100.
.123
5.3e+3
4e-5
4.3e3.5
3E-1.2
3a78

输出:

 true
 true
 true
 true
 true
 false
 false
 false

解题思路:
对输入串进行以下筛选,符合以下条件的输入串就符合要求:
1、第一位字符只能是 + - . 0-9
2、输入串中小数点最多只能出现一次且只能出现在e之前
3、e后面的符号串只能是正负号和数值字符
4、输入串的符号只能是 + - . 0-9 e E

循环遍历输入串,当不符合以上任意一个条件时,就返回false即可,当遍历完输入串都没有返回false的话,就说明输入串表示的是数值,返回true。

Java实现:

public class Solution {
    public boolean isNumeric(char[] str) {
    	// 判断条件1
        if(str[0]=='+' || str[0]=='-' || (str[0]>='0'&&str[0]<='9') ||str[0]=='.'){
            int i=1; 
            boolean f1 = false;  // 标记小数点出现的次数
            boolean f2 = false;  // 标记小数点出现在e之前还是e之后
            while(i<str.length){
                if(str[i] == '.'){ // 判断条件2
                    if(!f1 && !f2)  // 若小数点首次出现且出现在e之前,说明符合要求,其余的都是不符合要求
                        f1 = true;
                    else
                        return false;
                }else if(str[i] == 'e' || str[i] == 'E'){  // 判断条件3
                    f2 = true;
                    if(i==str.length-1) 
                        return false;
                    if(!((str[i+1]>='0'&& str[i+1]<='9') || str[i+1]=='-' || str[i+1]=='+'))  // 
                        return false;
                    i++;
                }else if(str[i]<'0' || str[i]>'9')  // 经过上面的筛选,该位上的数只能是数字字符
                    return false;
                i++;
            }
            return true;
        }
        return false;
    }
}

另一只解法:
用Java中Double的方法和异常结合使用
链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
来源:牛客网

public class Solution {
    public boolean isNumeric(char[] str) {
        try {
            double re = Double.parseDouble(new String(str));
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值