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