Leetcode:65. 有效数字

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

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

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

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

 

解题思路:

1. 排除首位的空格,如果全部是空格return false。最终确定left和right的位置。

2. 第一个字符可能是‘+’,‘-’,‘.’。left++。如果这一步出现了小数点,那么后面不能出现小数点。

3. 判断[left,right]之间是否是数字。之间只可能出现数字,正负号,e,E,除此之外直接返回false。

4. 另外,e(E)仅可能出现一次,且不能出现在left位置。

5. e后面必须要有东西,可以是正负号加至少一个数字,或者直接加数字。

6. 小数点仅可能出现在e(E)的前面,如果有e(E)的话。

 

本人亲测,这题运行时间不稳,4ms范例也是基本稳定在28ms处。所以不追究此题的速度问题。判断一个字符串是否是数字的时间复杂度是字符串长度(n)。

Leetcode:65. 有效数字

C++代码
class Solution {
public:
    bool isNumber(string s) {
        int size = s.size();
        if (size == 0) return false;
        int left = 0, right = size-1;
        while (s[left] == ' '&&left < right) { left++; }
        while (s[right] == ' '&&left < right) { right--; }
        if (left == right) return (s[left]<='9' && s[left]>='0');
        if (s[left] == '+' || s[left] == '-') {
            if (left == right) return false;
            left++;
        }
        if (!(s[left] <= '9' && s[left] >= '0')&& s[left]!='.') return false;
        int point = 1, e = 1;
        if (s[left] == '.') { 
            point = 0; 
            left++;
            if (!(s[left] <= '9' && s[left] >= '0')) {
                return false;
            }
        }
        while (left <= right) {
            if (s[left] <= '9'&&s[left] >= '0') {}
            else if (s[left] == '.') {
                if (e == 0) return false;
                if (point == 0) return false;
                point--;
            }
            else if (s[left] == 'e' || s[left] == 'E') {
                if (e == 0) return false;
                e--;
                if (left + 1 <= right) {
                    if (s[left + 1] == '+' || s[left + 1] == '-') {
                        if (left + 2 <= right) {
                            if (!(s[left + 2] >= '0'&&s[left + 2] <= '9')) {
                                return false;
                            }
                            else { left += 2; continue; }
                        }
                        else return false;
                    }
                }
                else return false;
            }
            else return false;
            left++;
        }
        return true;
    }
};