65. 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.
class Solution {
public:
bool isNumber(string s)
{
int k = 0;
while (1) //先去除开头的空格
{
if(s[k] == ' ')
s = s.substr(1, s.size()-1);
else
break;
}
if(s.size() == 0)
return 0;
while(1) //去除末尾的空格
{
k = s.size()-1;
if(s[k]==' ')
s = s.substr(0, s.size()-1);
else
break;
}
k = 0;
int flag = 0; //记录有没有 '.'
int flag3 = 0; //记录有没有 '-' 或者 '+'
int flag4 = 0; //记录有没有 'e'
while (k < s.size())
{
if(int(s[k]) >= 48 && int(s[k]) <= 57) // 0 - 9
{
k++;
continue;
}
else if(int(s[k]) == 46 && flag == 0 && flag4 == 0) // '.'
{
flag = 1;
if (k == 0 && s.size() == 1)// 排除"."
return 0;
else if(k != 0 && k < s.size() - 2 && s[k+1] == 'e') // "14.e3" true
{
k++;
continue;
}
else if (k != s.size() - 1 && (int(s[k+1]) < 48 || int(s[k+1]) > 57)) // '.'后面是非法的字母等
return 0;
else if (k == s.size() - 1 && s[k-1] == '-' && k > 0) // 排除 "-."
return 0;
else
{
k++;
continue;
}
}
else if (int(s[k]) == 101 && k != 0 && k != s.size() - 1 && s[k+1] != '.' && flag4 == 0) // 'e'
{
flag4 = 1;
if (k == 1 && (int(s[k-1]) < 48 || int(s[k-1]) > 57)) //'e'之前的非法字母
return 0;
else
{
k++;
continue;
}
}
else if (int(s[k]) == 45) // -
{
if (flag3 == 0 || (k > 0 && s[k-1] == 'e')) //只有 "-23" 或者 "2e-3" 才可以
{
flag3 = 1;
if((s[k-1] == 'e' && k != s.size()-1) || (k == 0 && s.size() != 1)) // 排除"2e-"
{
k++;
continue;
}
else
return 0;
}
else
return 0;
}
else if (int(s[k]) == 43 && k != s.size()-1) //+
{
if (flag3 == 0 || (k > 0 && s[k-1] == 'e')) //只有 "+23" 或者 "2e+3" 才可以
{
flag3=1;
if(s[k+1] == '.' && k + 1 != s.size()-1) // "+.3" true
{
k++;
continue;
}
else if(k == 0)
{
k++;
continue;
}
else if(k != 0 && s[k-1] == 'e' && k != s.size() - 1)
{
k++;
continue;
}
else
return 0;
}
else
return 0;
}
else
return 0;
}
return 1;
}
};