题目链接:Valid Number

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.

这道题的要求是判断1个字符串是否是数字。

字符串处理,不过有几个细节需要注意:

  1. 数字可以有前导空格和后置空格,不过数字中间不允许有空格;
  2. 对于’.’,最多只允许出现1次,其前面可以没有数字,但后面一定要有数字;
  3. 对于’e’,最多只允许出现1次,其前后都必须有数字,但后面一定是整数,即不能出现’.’;
  4. 对于’+’和’-‘,’e’的前后都最多只允许出现1次,且一定要在数字最前面出现;
  5. 至于其他字符,只允许是数字(0~9)。

下面有几个例子:

"e"     =>   false
"."     =>   false
" "     =>   false
".1"    =>   true
"0e"    =>   false
"e9"    =>   false
"7e+6"  =>   true
"6+1"   =>   false

时间复杂度:O(n)

空间复杂度:O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution
{
public:
    bool isNumber(string s)
    {
        int i = 0;
        // 跳过前导空格
        for( ; i < s.size() && ' ' == s[i]; ++ i);
        // 处理正负号
        if('+' == s[i] || '-' == s[i])
            ++ i;
        // 处理后面数字部分
        bool digit = false, dot = false, exp = false;
        for( ; i < s.size(); ++ i)
        {
            if('.' == s[i] && !dot) // '.'不能出现2次,'.'前面可以没有数字
                dot = true;
            else if('e' == s[i] && !exp && digit) // 'e'不能出现2次,'e'前面必须有数字
            {
                // 'e'后面不能出现'.','e'后面必须是整数(可以是正的或负的)
                dot = exp = true;
                if(i + 1 < s.size() && ('+' == s[i + 1] || '-' == s[i + 1]))
                    ++ i;
                if(i + 1 >= s.size() || !(s[i + 1] >= '0' && s[i + 1] <= '9'))
                    return false;
            }
            else if(s[i] >= '0' && s[i] <= '9')
                digit = true;
            else
                break;
        }
        
        // 跳过后面空格
        for( ; i < s.size() && ' ' == s[i]; ++ i);
        
        return digit && i == s.size();
    }
};