剑指Offer_表示数值的字符串

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

参考思路
       其实该题是一个分类讨论问题,只需要满足一定的条件的字符串就是一个数值字符串。条件如下:
       ·±号后面必定为数字或后面为.(-.123 = -0.123)
       ·±号只出现在第一位或在eE的后一位
       · 后面必定为数字或为最后一位(233. = 233.0)
       · eE后面必定为数字或±号

参考代码

public class Solution {
    public boolean isNumeric(char[] str) {
        // 标志小数点和指数,表示小数点或者指数只能出现一次,两次则不是规范数值
         boolean point = false, exp = false; 
        for(int i=0;i<str.length;i++){
            //'+-'后面只能是数字或者‘.’
            if(str[i] == '+' || str[i] == '-'){
                if(i+1 == str.length || !(str[i+1]>='0' && str[i+1]<='9' 
                                         ||str[i+1] == '.')){
                    return false;
                }
                // +-号只出现在第一位或eE的后一位
             if (!(i == 0 || str[i-1] == 'e' || str[i-1] == 'E')) { 
                    return false;
                }
            }
                //'.'只能是最后一位或者后面是数字,此外如果已经是指数了,说了这个带'.'在exp后面,
              //而指数不能为小数,因此exp也加入判断
                else if(str[i] == '.'){
                    if(point || exp || i+1 == str.length ||!(str[i+1]>='0' && str[i+1]<='9')){
                        return false;
                    }
                    point = true;
                }
                //'Ee'后面必须是数字或者'+-'
                else if(str[i] == 'E' || str[i] == 'e'){
                    if(exp || i+1 == str.length  ||!(str[i+1]>='0' && str[i+1]<='9' 
                                                  || str[i+1] == '+' || str[i+1] == '-')){
                        return false;
                    }
                    exp = true;
                }
                //如果为数字则正常执行
                else if(str[i]>='0' && str[i]<='9'){}
                else{
                    return false;
                }
            }
            return true;
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值