🌕 剑指 Offer 20. 表示数值的字符串

吞佛童子2022年10月10日
  • algorithm
  • String
小于 1 分钟

🌕 剑指 Offer 20. 表示数值的字符串

难度: 🌕

问题描述

img_13.png


解法

class Solution {
    public boolean isNumber(String s) {
        // 思路:
        // 根据题意判断条件
        String str = s.trim(); // 去掉空格
        int len = str.length();
        if(len == 0) {
            return false;
        }
        // 判断是否有 e/E,然后分成 2 部分,分别判断
        int indexE = str.indexOf('e');
        if(indexE == -1) {
            indexE = str.indexOf('E');
        }
        if(indexE == -1) {
            // 只需要判断整个字符串
            return isInteger(str, 0, len - 1) || isPoint(str, 0, len - 1);
        } else {
            return (isInteger(str, 0, indexE - 1) || isPoint(str, 0, indexE - 1)) && isInteger(str, indexE + 1, len - 1);
        }
    }

    private boolean isPoint(String str, int left, int right) {
        // 递归终止条件
        if(left > right) {
            return false;
        }
        if(str.charAt(left) == '-' || str.charAt(left) == '+') {
            return isPoint(str, left + 1, right);
        }
        // 找到 小数点位置
        int indexP = -1;
        for(int i = left; i <= right; i ++) {
            if(str.charAt(i) == '.') {
                indexP = i;
                break;
            }
        }
        if(indexP == -1) {
            return false;
        }
        if(left == right) {
            return false; // 只有一个小数点
        }
        return isVal(str, left, indexP - 1) && isVal(str, indexP + 1, right);
    }

    private boolean isVal(String str, int left, int right) {
        for(int i = left; i <= right; i ++) {
            if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
                continue;
            } else {
                return false;
            }
        }
        return true;
    }

    private boolean isInteger(String str, int left, int right) {
        // 递归终止条件
        if(left > right) {
            return false;
        }
        if(str.charAt(left) == '-' || str.charAt(left) == '+') {
            return isInteger(str, left + 1, right);
        }
        return isVal(str, left, right);
    }
}

输出

img_12.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou