53、表示数值的字符串

链接:https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
来源:牛客网

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

这题真是令人作呕,各种情况都要考虑,很容易出错,以下是我写的代码,判题系统居然说-.123是数字,没有给ac。

53、表示数值的字符串_第1张图片
public class Solution {
    public boolean isNumeric(char[] str) {
        if(str.length==0){
            return false;
        }
        //第一个字符是+、-
        if(str[0]=='+'||str[0]=='-'){
            return isNumeric2(str,1);
        }
        
        return isNumeric2(str,0); 
    }
    
    //没有正负号的数字
    public boolean isNumeric2(char[] str, int i){
        if(str[i]>='1'&&str[i]<='9'){
            //判断是否科学计数法
            if(isE(str,i+1)){
                return isNumeric3(str, i+1);
            }else{
                int count = 0; //小数点的个数
                for(int j=i+1; j'9'){
                        return false;
                    }
                }
                if(count>1){
                    return false;
                }
                return true;
            }
        }
        return false;
        
    }
    
    //科学计数法的数字
    public boolean isNumeric3(char[] str, int i){
        //遍历找到e或E的位置
        int j=i;
        for(; j'9'){
                return false;
            }
        }
        if(count>1){
            return false;
        }
        
        //凡是右边的必须是+5、-2、3这样的整数
        for(int k=j+1; k'9'){
                return false;
            }
        }
        return true;
    }
    
    //是否科学计数法
    public boolean isE(char[] str, int i){
        for(int j=i; j

如果允许用正则表达式或者库函数就另当别论了,以下是ac的代码。

public class Solution {
    public boolean isNumeric(char[] str) {
        String string = String.valueOf(str);
        return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
    }  
}
public class Solution {
    public boolean isNumeric(char[] str) {
        try {
            double re = Double.parseDouble(new String(str));
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }  
}

你可能感兴趣的:(53、表示数值的字符串)