算法提高之LeetCode刷题

Valid Number

2019-02-19  本文已影响0人  尚无花名

有效数字这道题情况很复杂,但是你一旦理清了情况,写起来也不是很难。
笔者参考了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);
    }
上一篇下一篇

猜你喜欢

热点阅读