LeetCode 第65题 有效数字

LeetCode 第65题
总的思路,就是先根据小数点分割,再根据e来分割,判断分割后的字符串的合法性。
感觉代码逻辑还可以~
在这里插入图片描述

class Solution {
    //count用来计数,如果包含小数点,记录是根据小数点分割的第几个字符串片段
    int count = 0;
    public boolean isNumber(String s) {
        if(null == s || s.length() == 0) {
            return false;
        }
        //防止多个.或者e的情况
        if(s.indexOf(".") != s.lastIndexOf(".") || s.indexOf("e") != s.lastIndexOf("e")) {
            return false;
        }
        if(s.contains(".")) {
            if(s.length() == 1) {
                return false;
            }          
            String[] splitArr = s.split("\\.");
            //防止.+的情况
            if(splitArr.length == 1 && splitArr[0].length() == 1 && (splitArr[0].contains("+") || splitArr[0].contains("-"))) {
                return false;
            }
            //防止.e的情况
            if(splitArr.length == 2  && splitArr[0].length() == 0 && (splitArr[1].startsWith("E") || splitArr[1].startsWith("e"))) {
                return false;
            }
            //防止e为在小数点之前的情况
            if(splitArr[0].contains("e") || splitArr[0].contains("E")) {
                return false;
            }
            //小数点分割出的每一段,都去做校验
			for(String str : splitArr) {
                if(!check(str, true)) {
                    return false;
                }
                count++;
            }
        }else {
            if(!check(s, false)) {
                return false;
            }
        }
        return true;
    }
	
    //校验方法,能同时校验小数点分割的情况、没有小数点的情况
    //flag作为是否产生小数点分割的标志位
	public boolean check(String s, boolean flag) {
        if(count == 0 && (s.startsWith("e") || s.startsWith("E"))) {
            return false;
        }
        boolean eFlag = s.contains("e");
        boolean EFlag = s.contains("E");
        if(eFlag || EFlag){
            String[] split = null;
            if(eFlag) {
                split = s.split("e");
            }else {
                split = s.split("E");
            }
            if(split.length != 2) {
                return false;
            }
			for(String str : split) {
                boolean symbolFlag = false;
                if(str.startsWith("+") || str.startsWith("-")) {
                    symbolFlag = true;
                }
                int i = 0;
                if(symbolFlag) {
                    i++;
                }
                for(; i < str.length(); i++) {
                    char charAt = str.charAt(i);
                    if(charAt < 48 || charAt > 57) {
                      return false;
                    }
                }
                //校验仅有单符号的情景,比如4e+
                if(symbolFlag && str.length() == 1) {
                    return false;
                }
            }
        }else {
            boolean symbolFlag = false;
            if(s.startsWith("+") || s.startsWith("-")) {
                symbolFlag = true;
            }
            //如果这是根据小数点分割的第二个字符串,且以+号开头,则直接返回false。类似1.+56
            if(count == 1 && symbolFlag && flag) {
                return false;
            }
            int i = 0;
            if(symbolFlag) {
                i++;
            }
            //根据小数点,e分割完了之后,字符串片段中,不是开头的部分只能为数字,否则都是无效的
            for(; i < s.length(); i++) {
                char charAt = s.charAt(i);
                if(charAt < 48 || charAt > 57) {
                    return false;
                }
            }
        }
		return true;
    }
}

结果
65.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值