LeetCode: Valid Number

問題描述java

<pre> Validate if a given string is numeric. Some examples: ` "0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true ` Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. </pre>git

<!--more-->ui

這道題看上去很簡單,可是實際作的時候發現有不少意外的狀況,主要是 case 沒有想徹底,有的 case 甚至是想錯了。每次發現意外狀況就微調下代碼,到最後代碼亂得本身都不想看了,並且再改起來牽一髮動全身的感受。因而又稍微重構了一下代碼。最後 AC 的代碼以下:code

public class ValidNumber {

    public boolean isNumber(String s) {
        String trimed = s.trim();
        int len = trimed.length();

        boolean isNewGroup = true, hasNumberInGroup = false, hasPointInGroup = false;
        int groupNum = 1;
        for (int i = 0; i < len; i++) {
            char ch = trimed.charAt(i);
            if (!validChar(ch)) {
                return false;
            }
            if (isNewGroup) {
                isNewGroup = false;
                if (isDigit(ch)) {
                    hasNumberInGroup = true;
                } else if (isPoint(ch)) {
                    if (groupNum > 1) {
                        return false;
                    }
                    hasPointInGroup = true;
                } else if (isE(ch)){
                    return false;
                } else {
                    continue;
                }
            } else {
                if (isSign(ch)) {
                    return false;
                } else if (isPoint(ch)) {
                    if (hasPointInGroup) {
                        return false;
                    } else {
                        if (groupNum > 1) {
                            return false;
                        }
                        hasPointInGroup = true;
                    }
                } else if(isE(ch)) {
                    if (!hasNumberInGroup) {
                        return false;
                    }
                    isNewGroup = true;
                    hasNumberInGroup = false;
                    hasPointInGroup = false;
                    groupNum++;
                    if (groupNum > 2) {
                        return false;
                    }
                } else {
                    hasNumberInGroup = true;
                    continue;
                }
            }
        }
        if (!hasNumberInGroup) {
            return false;
        }

        return true;
    }

    private boolean validChar(char ch) {
        return (isSign(ch)
                || isDigit(ch)
                || isE(ch)
                || isPoint(ch));
    }

    private boolean isSign(char ch) {
        return (ch == '-' || ch == '+');
    }

    private boolean isDigit(char ch) {
        return (ch >= '0' && ch <= '9');
    }

    private boolean isE(char ch) {
        return (ch == 'e' || ch == 'E');
    }

    private boolean isPoint(char ch) {
        return ch == '.';
    }
}

能夠說這段代碼寫的並不漂亮,勉強能行吧。後來看到網上有人用狀態機去作,代碼比較清晰。不過我想當他不斷遇到意外狀況的時候調整狀態機,應該也比較費勁吧。rem

後來給一個同事看這個題,剛開始也跟我感受同樣,以爲應該挺簡單的,真正作起來也發現挺坑爹的。string

相關文章
相關標籤/搜索