65. Valid Number

有效数字这道题情况很复杂,但是你一旦理清了情况,写起来也不是很难。
笔者参考了Leetcode讨论区的答案,有个小哥写的真是漂亮。
我这里理一下基本逻辑。
首先先处理空格。
我们期待的数据形式大概是如下
可有可无的+/-号(最多有一个)
数字
可有可无的小数点
小数点后的数字可有可无
E,科学计数位 可有可无
E之后可能有符号位。
如果有E,之后一定要有数字
所以设计几个flag

  1. numberBeforeESeen
  2. numberAfterESeen
  3. eSeen;
  4. pointSeen;
    如果numberBeforeESeen是false, 肯定不行
    如果eSeen,但是numberAfterESeen false也不行。
    所以最后结果是 return numberBeforeESeen && eSeen ? numberAfterESeen : true;
    然后就是分各种情况讨论。
    如果遇到数字怎么办
    如果遇到+/-号怎么办
    如果遇到E怎么办
    如果遇到point怎么办。
    如果遇到其他怎么办。

看下代码. 你看这代码可以写的很漂亮(参考别人的)
看到这种复杂问题不要怵, 一点一点分析。

    public boolean isNumber(String s) {
        if (s == null) return false;
        s = s.toLowerCase().trim();
        boolean eSeen = false, numberBeforeESeen = false, numberAfterESeen = false;
        boolean pointSeen = false;
        int pt = 0; 
        while (pt < s.length() ) {
            char ch = s.charAt(pt);
            if (Character.isDigit(ch)) {
                if (eSeen) numberAfterESeen = true;
                else numberBeforeESeen = true;
            } else if (ch == '.') {
                if (eSeen || pointSeen) return false;
                pointSeen = true;
            } else if (ch == '+' || ch == '-') {
                if (pt != 0 && s.charAt(pt - 1) != 'e') {
                    return false;
                }
            } else if (ch == 'e' || ch == 'E') {
                if (eSeen || (!numberBeforeESeen)) return false;
                eSeen = true;
            } else return false;
            pt++;
        }
        return numberBeforeESeen && (eSeen ? numberAfterESeen : true);
    }

这题有个简化版,就是不用考虑有e的情况
这样就简单多了。
如果我们遇到一个数字,则set numberSeen true。
如果我们遇到了 ".", 则看一下以前有没有遇到过 “。”
如果我们遇到了 “+” “-”, 则看他是不是在第一位。
其他情况返回false
最后看看我们有没有至少见到一个数字。
我把它放到65里面也测了一下没问题。

private boolean isNumberNoE(String s) {
        // s is trimmed.
        int pt = 0;
        boolean numberSeen = false, dotSeen = false;
        while (pt < s.length()) {
            if (Character.isDigit(s.charAt(pt))) {
                numberSeen = true;
            } else if (s.charAt(pt) == '+' || s.charAt(pt) == '-') {
                if (pt != 0) return false;
            } else if (s.charAt(pt) == '.') {
                if (dotSeen) return false;
                dotSeen = true;
            } else {
                return false;
            }
            pt++;
        }
        return numberSeen;
    }

你可能感兴趣的:(65. Valid Number)