[leetcode] 65. 有效数字

65. 有效数字

第19次才通过,前面错了18次。。。

相信我,不用理解或者分析我的代码,一遍一遍去自己尝试吧少年,十几次后你就会做出来了

你会感受到这个题带来的诚意的

class Solution {
    public boolean isNumber(String s) {
        // 去掉前后空格
        s = s.trim();
        if (s.length() == 0) return false;
        if (s.charAt(0) == '-' || s.charAt(0) == '+') {
            if (s.length() == 1) {
                return false;
            }
            s = s.substring(1);
        }
        // 去掉前导0
        while (s.charAt(0) == '0') {
            if (s.length() == 1) {
                // 就剩一个0了
                return true;
            }
            if (s.charAt(1) == '.' || s.charAt(1) == 'e') {
                // 应对比如0000.123这种情况
                break;
            }
            s = s.substring(1);
        }
        // 处理e后面出现+-号的情况
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == 'e') {
                if (i + 1 < s.length()) {
                    if (s.charAt(i + 1) == '-' || s.charAt(i + 1) == '+') {
                        String newS = "";
                        newS = s.substring(0, i + 1);
                        if (i + 2 < s.length()) {
                            newS += s.substring(i + 2);
                        }
                        s = newS;
                    }
                }
            }
        }

        boolean flag = false;
        boolean dflag = false;
        boolean eflag = false;
        boolean numFlag = false;
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (!isnum(ch)) {
                if (ch == '.' || ch == 'e') {
                    if (ch == 'e') {
                        // e前面必须有数字,而。不用
                        if (!numFlag) return false;

                    }
                    if (ch == 'e' && (i + 1 >= s.length())) {
                        // e后面必须有数字
                        return false;
                    }
                    if (flag) {
                        // 。 or e只能出现1次
                        if (ch == 'e' && dflag && !eflag) {
                            eflag = true;
                            continue;
                        }
                        return false;
                    }

                    if (ch == '.' && i + 1 < s.length() && s.charAt(i + 1) == 'e' && numFlag && i + 2 < s.length()) {
                        // 特判: .e  同时出现时- -
                        i++;
                    }
                    flag = true;
                    if (ch == '.') dflag = true;
                    if (ch == 'e') eflag = true;
                    continue;
                }
                return false;
            } else {
                numFlag = true;
            }
        }
        return numFlag;
    }

    public boolean isnum(char ch) {
        return ch >= '0' && ch <= '9';
    }
}
posted @ 2018-07-24 23:18  ACBingo  阅读(402)  评论(0编辑  收藏  举报