LeetCode-65.有效数字(相关话题:数字,字符串)

验证给定的字符串是否为数字。

例如:

"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。

更新于 2015-02-10:

C++函数的形式已经更新了。如果你仍然看见你的函数接收 const char * 类型的参数,请点击重载按钮重置你的代码。

解题思路:

其实个人也没什么思路...感觉就是根据各种情况不断的修正代码,并没有体会到任何算法的精妙之处,是目前唯一一道做出来之后,内心没有丝毫的成就感甚至想吐槽的题......个人感觉其实没太多做的必要。

java代码:

class Solution {
    public boolean isNumber(String s) {
        if(null == s || 0 == s.length())
            return false;

        if("".equals(s = s.trim()))
            return false;
        int len = s.length();
        boolean hasPoint = false;   //是否已经有小数点
        boolean hasE = false;
        boolean hasNum = false;
        for(int i = 0; i < len; i++) {
            //字符串中间有空格,false
            if(s.charAt(i) == ' ')
                return false;

            //有符号数字
            if(0 == i && (s.charAt(i) == '-' || s.charAt(i) == '+')) {
                continue;
            }
            if(0 == i && s.charAt(i) == '.') {
                hasPoint = true;
                continue;
            }

            int iNum = s.charAt(i) - '0';
            if(iNum >= 0 && iNum <= 9)
                hasNum = true;

            //字符串中出现非数字,并且不是"."、"e"、"E"、"+"、"-",false
            if((iNum < 0 || iNum > 9) && (s.charAt(i) != '.' && s.charAt(i) != 'e' && s.charAt(i) != 'E' && s.charAt(i) != '+' && s.charAt(i) != '-'))
                return false;
            //当前字符为小数点,若已经出现过小数点或者指数e/E,false
            if((s.charAt(i) == '.' && (hasPoint || hasE))) {
                return false;
            } else if(s.charAt(i) == '.') {
                hasPoint = true;
            }
            //当前字符为指数e/E,若为结尾字符,或之前为出现过数组或者已经出现过e/E,false
            if((s.charAt(i) == 'e' || s.charAt(i) == 'E') && (i == len-1  || !hasNum || hasE)) {
                return false;
            } else if(s.charAt(i) == 'e' || s.charAt(i) == 'E') {
                hasE = true;
            }
            //当前字符为+/-(非首字符,则只能表示指数的符号),前一字符若不为e/E,或者为字符串最后一位字符,false(保证e/E前后都必须为有效数字)
            if((s.charAt(i) == '+' || s.charAt(i) == '-') && ((s.charAt(i-1) != 'e' && s.charAt(i-1) != 'E') || i == len-1))
                return false;
        }

        return ((s.charAt(len-1) - '0') >= 0 && (s.charAt(len-1) - '0') <= 9) || hasNum;
    }
}

你可能感兴趣的:(LeetCode,Java)