问题描述:
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.此题的意思是:判断给出的一个string代表的数是不是有效的。
2. 要判断首先得知道:数字可能会有正负号、小数点、和指数标志e。有以下几点:
1. 正负号只能出现在第一个位置或者e的下一个位置,各只能出现一次,并且正负号之后必须有数字。
2. 小数点只能出现一次,并且在e之前,并且小数点出现时前面必须有数字出现。
3. e只能出现一次,并且e前面必须有数字出现,而且e之后不能有小数点。
3. 方法就是按照上述的判断规则判断字符串是否满足规格即可。
代码如下:
class Solution {
public:
bool isNumber(string s)
{
int size = s.size();
// 跳过前导空格
int i = 0;
i = s.find_first_not_of(' ');
// 处理正负号
if(i>=0 && i<size &&'+' == s[i] || '-' == s[i])
++i;
// 处理后面的数字,bHasdight代表之前是否出现数字,bHasPoint代表是否出现‘.’,bHasExp代表是否出现‘e’
bool bHasdight = false, bHasPoint = false, bHasExp = false;
for(; i<size; ++i)
{
// 处理‘.’,一个‘.’只能出现一次,数字之前可以出现‘.’
if('.' == s[i] && !bHasPoint)
bHasPoint = true;
else if(s[i] >='0' && s[i]<='9')
bHasdight =true;
// 处理出现‘e’的情况,并且‘e’之后只能是数字,而且‘e’之后可以有正负号,不能有‘.’。‘e’出现之前必须出现数字
else if('e' == s[i] && !bHasExp && bHasdight)
{
bHasExp = true;
bHasPoint = true;
++i;
if(i <size && '+'==s[i] || '-'==s[i])
{
if(i+1<=size && s[i+1]>='0' && s[i+1]<='9')
++i;
else
return false;
}
else if(i>=size ||s[i]<'0' || s[i]>'9')
return false;
}
else
break;
}
// 跳过数字后面的空格
while(i<size && s[i]== ' ')
++i;
return bHasdight && i == size;
}
};