题目:
Validate if a given string can be interpreted as a decimal number.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
" -90e3 "
=> true
" 1e"
=> false
"e3"
=> false
" 6e-1"
=> true
" 99e2.5 "
=> false
"53.5e93"
=> true
" --6 "
=> false
"-+3"
=> false
"95a54e53"
=> false
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:
- Numbers 0-9
- Exponent - "e"
- Positive/negative sign - "+"/"-"
- Decimal point - "."
Of course, the context of these characters also matters in the input.
Update (2015-02-10):
The signature of the C++
function had been updated. If you still see your function signature accepts a const char *
argument, please click the reload button to reset your code definition.
代码:
class Solution {
public:
bool isNumber(string s) {
int len = s.length();
if(len < 1)
return false;
int isdot = 2, is16 = 0, isNum = 0, isE = 1, i, start;
for(i = 0; i < len && s[i] == ' '; i++);
start = i;
for(; i<len; i++)
{
if(s[i] >= '0' && s[i] <= '9')
{
isNum++;
continue;
}
else if(s[i] == ' ')
break;
else if((s[i] >= 'a' && s[i]<='f') || (s[i] >= 'A' && s[i] <= 'F'))
{
if(s[i] == 'e' || s[i] == 'E')
{
if(!is16)
{
if(!isE || i < 1 || i == len - 1 || !isNum)
return false;
if((s[i+1] <= '9' && s[i+1] >= '0') || s[i+1] == '-' || s[i+1] == '+')
{
isE--;
if(s[i+1] == '-' || s[i+1] == '+')
i++;
isNum = 0;
continue;
}
return false;
}
}
if(!is16)
return false;
continue;
}
else if(s[i] == 'x' || s[i] == 'X')
{
if(i == 1 && s[i-1] == '0')
{
is16 = 1;
isNum = 0;
continue;
}
else
return false;
}
else if(s[i] == '.')
{
if(!isE)
return false;
isdot--;
}
else if(s[i] == '-' || s[i] == '+')
{
if(!isNum && i == start)
continue;
return false;
}
else
return false;
if(!isdot)
return false;
}
for(; i < len && s[i] == ' '; i++);
if(!isNum || i != len)
return false;
return true;
}
};