Leetcode 有效数字

有效数字

题目描述:

有效数字(按顺序)可以分成以下几个部分:
  1. 一个小数或者整数
  2. (可选)一个 'e' 或 'E' ,后面跟着一个整数
小数(按顺序)可以分成以下几个部分:
  1. (可选)一个符号字符('+' 或 '-')
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 '.'
    2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3. 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
  1. (可选)一个符号字符('+' 或 '-')
  2. 至少一位数字
部分有效数字列举如下:
["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:
["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

题目链接

class Solution {
    
    
    public boolean isNumber(String s) {
    
    
        int sign = 0;
        int point = 0;
        // 初步过滤:过滤掉只剩最多一个正负符号或者最多一个小数点
        for(int i = 0 ; i<s.length() ; i++){
    
    
            if(s.charAt(i) == '+' || s.charAt(i) == '-') sign ++;
            else if(s.charAt(i) == '.') point ++;
            if(sign > 2 || point > 1) return false;
        }
        s = s.toLowerCase();
        String[] nums = s.split("e");
        if(nums.length > 2) return false;
        if(s.charAt(s.length() - 1) == 'e') return false;
        else if(nums.length == 1){
    
    
            return isFloat(nums[0]) | isInteger(nums[0]);
        }else if(nums.length == 2){
    
    
            if(!nums[0].equals("")) return (isFloat(nums[0]) | isInteger(nums[0])) & isInteger(nums[1]);
            else return false;
        }else{
    
    
            return false;
        }
    }

    private boolean isFloat(String s){
    
    
        if(s.length() == 1){
    
    
            if(s.charAt(0) == '-' || s.charAt(0) == '+'){
    
    
                return false;
            }
        }
        if(s.length() == 2){
    
    
            if((s.charAt(0) == '-' || s.charAt(0) == '+') && s.charAt(1) == '.'){
    
    
                return false;
            }
        }
        if(s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1,s.length());
        for(int i = 0 ; i<s.length() ; i++){
    
    
            if(i == 0 && s.charAt(i) == '.' && ( i == s.length()-1 ||  s.charAt(i+1) > '9' || s.charAt(i+1) < '0' )) return false;
            if(i == s.length() - 1 && s.charAt(i) == '.' && ( i == 0 ||  s.charAt(i-1) > '9' || s.charAt(i-1) < '0' )) return false;
            if((s.charAt(i) == '.') && (i-1 >= 0 && (s.charAt(i-1)<'0' || s.charAt(i-1)>'9') 
                || i+1 < s.length() && (s.charAt(i+1)<'0' || s.charAt(i+1)>'9'))) 
            return false;
            if(s.charAt(i) != '.' && (s.charAt(i) > '9' || s.charAt(i) < '0')) return false;
        }
        return true;
    }

    private boolean isInteger(String s){
    
    
        if(s.length() == 1){
    
    
            if(s.charAt(0) == '-' || s.charAt(0) == '+'){
    
    
                return false;
            }
        }
        if(s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1,s.length());
        for(int i = 0 ; i<s.length() ; i++){
    
    
            if(s.charAt(i)<'0' || s.charAt(i)>'9') return false;
        }
        return true;
    }
}

该题核心为两个判断方法,第一个为判断是否为小数,另一个为判断是否为整数,然后按照题意逻辑构建规则即可,详细请看代码。

猜你喜欢

转载自blog.csdn.net/weixin_43914658/article/details/113799439