Valid Number

作者: 尚无花名 | 来源:发表于2019-02-19 13: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);
        }
    

    相关文章

      网友评论

        本文标题:Valid Number

        本文链接:https://www.haomeiwen.com/subject/jkixyqtx.html