leetcode65- Valid Number- hard

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.

 

几个要考虑的情况:整数,小数decimal,正号负号,科学计数法。问:1e9   .5, 6.可以吗(可以)?  e可以和小数一起出现吗 0.5e100 (e前面可以有小数后面不行)

可以允许的符号有:'0'~'9'  '.'  'e' '+-'   

规则有:

1. 必须有数字出现过,单独的'.' 'e' '+-' 都不是数字。所以最后返回numSeen && eSeen

2. '.' 只可以出现一次,而且不能出现在e后面。

3.'e'只可以出现一次,而且前后都必须有数字。

4.'+-' 必须在最前面,或者紧跟在e后面。

5. ' ' 不能出现在中间,但可以在头尾。用s = s.trim()解决(这点面试的时候就别讲了吧,太刻意了)

 

实现:

class Solution {
//1. '.' 只可以出现一次,而且不能出现在e后面,而且后面必须有数字。
//2.'e'只可以出现一次,而且前后都必须有数字。
//3.'+-' 必须在最前面,或者紧跟在e后面。
//4. ' ' 不能出现在中间,但可以在头尾。(这点面试的时候就别讲了吧,太刻意了)
//可以允许的符号有:'0'~'9'  '.'  'e' '+-'   

    public boolean isNumber(String s) {
        // 要先去掉头尾的空格
        s = s.trim();
        boolean numSeen = false;
        boolean pointSeen = false;
        boolean eSeen = false;
        boolean hasNumAfterE = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') {
                numSeen = true;
                if (eSeen) {
                    hasNumAfterE = true;
                }
            } else if (c == '.') {
                if (pointSeen || eSeen) {
                    return false;
                }
                pointSeen = true;
            } else if (c == 'e') {
                if (eSeen || !numSeen) {
                    return false;
                }
                eSeen = true;
            } else if (c == '+' || c == '-') {
                if (i != 0 && s.charAt(i - 1) != 'e') {
                    return false;
                }
            } else {
                return false;
            }
        }
        if (eSeen) {
            return numSeen && hasNumAfterE;
        }
        return numSeen;
    }
}

 

posted @ 2017-12-01 14:21  jasminemzy  阅读(203)  评论(0编辑  收藏  举报