题目链接: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             else30                 break;31         }32         33         // 跳过后面空格34         for( ; i < s.size() && ' ' == s[i]; ++ i);35         36         return digit && i == s.size();37     }38 };