剑指Offer-表示数值的字符串-3

表示数值的字符串

http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2

    // 方法3:直接使用IF-ELSE进行判断,覆盖所有可能
    // 思路:直接使用IF-ELSE语句扫描每个字符,每次遇到不同类别的字符时,则结合已接收的字符
    // 判断是否符合对应的要求.这种思路相比于其他几种方式的缺陷在于,
    // 容易遗漏各种可能性(当然一方面也是题目的问题).
    // 接收字符集:[0-9],[Ee],[.],[+-],other
    // 时间复杂度:O(n),空间复杂度:O(1)
    public boolean isNumeric(char[] str) {
        // 排除边界条件
        if (str == null || str.length == 0) return false;
        // 遍历字符数组,按照字符集类别进行不同的处理,每次都向过去检索(而不向后检索),统一检索方向,避免重复运算
        boolean hasSign = false, hasPoint = false, hasE = false; // 之前是否出现过[+-]/[.]/[Ee]字符
        char c;
        for (int i = 0; i < str.length; i++) {
            c = str[i];
            // 如果接收的是[Ee]字符
            if (c == 'E' || c == 'e') {
                // [Ee]字符只能出现一次
                if (hasE) return false;
                    // [Ee]字符之前必须为[0-9]字符
                else if (i - 1 < 0 || str[i - 1] < '0' || str[i - 1] > '9') return false;
                hasE = true;
            }
            // 如果接收的是[+-]字符
            else if (c == '+' || c == '-') {
                // [+-]如果之前出现过,那么当前字符之前必须为[Ee]字符
                if (hasSign && str[i - 1] != 'E' && str[i - 1] != 'e') return false;
                    // [+-]如果之前未出现过,那么当前字符必须为首字符,或者前面为[Ee]字符
                else if (!hasSign && i != 0 && str[i - 1] != 'E' && str[i - 1] != 'e') return false;
                hasSign = true;
            }
            // 如果接收的是[.]字符
            else if (c == '.') {
                // [.]字符只能出现一次,且之前不能出现过[Ee]字符,PS:[.]字符之前可以为空/[0-9]/[+-]
                if (hasPoint || hasE) return false;
                hasPoint = true;
            }
            // 其次如果接收的是非数字字符,则直接返回false
            else if (c < '0' || c > '9') return false;
        }
        // 字符结尾必须为数字
        return str[str.length - 1] >= '0' && str[str.length - 1] <= '9';
    }
全部评论

相关推荐

猪扒已出闸:方向不够聚焦,看不出来是想找什么方向的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务