题目链接: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次,其前面可以没有数字,但后面一定要有数字;
- 对于‘e‘,最多只允许出现1次,其前后都必须有数字,但后面一定是整数,即不能出现‘.‘;
- 对于‘+‘和‘-‘,‘e‘的前后都最多只允许出现1次,且一定要在数字最前面出现;
- 至于其他字符,只允许是数字(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 };