天天看點

[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';
    }
}
           

轉載于:https://www.cnblogs.com/acbingo/p/9363295.html