牛客网 表示数值的字符串

题目:

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

解题:

public class Solution {
    private int index = 0;
    public boolean isNumeric(char[] str) {
        // input check
        if(str.length < 1)
            return false;
        // execute
        boolean result = scanInteger(str);
        if(index < str.length && str[index] == '.'){
            index++;
            // 下面这句表示三种情况:整数部分和小数部分都存在; 整数部分存在,小数部分不存在; 整数部分不存在,小数部分存在
            // 不允许出现正数和小数都不出现的情况
            // 务必留意: result必须在||右边, 不能放在左边. 因为如果放在左边,同时result又是true, 那么就不会执行||右边的语句了
            result = scanUnsignedInteger(str) || result;
        }
        if(index < str.length && (str[index] == 'e' || str[index] == 'E')){
            index++;
            result = result && scanInteger(str);
        }
        // 不仅要返回result, 还要确保已经判断完每个char
        return result && (index == str.length);
    }

    public boolean scanInteger(char[] str){
        if(index < str.length && (str[index] == '+' || str[index] == '-'))
            index++;
        return scanUnsignedInteger(str);
    }
    public boolean scanUnsignedInteger(char[]str){
        int start = index;
        while(index < str.length && str[index] >= '0' && str[index] <= '9'){
            index++;
        }
        // index比start大, 说明扫描的部分有数字, 返回ture
        // index等于start, 说明扫描的部分没有数字, 返回false
        return start < index;
    }
}

 

posted @ 2020-01-28 10:51  yanhowever  阅读(197)  评论(0编辑  收藏  举报