题目链接: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
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();
}
};