《剑指offer》面试题20. 表示数值的字符串
问题描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"、"-1E-16"及"12e+5.4"都不是。
代码
class Solution {
public:
bool isNumber(string s) {
if(s == "." || s == " ")return false;
int i,n = s.size(),start = 0,end = n-1;
while(s[start] == ' ')++start;
while(s[end] == ' ')--end;
if(s[start] == '+' || s[start] == '-')start++;
int e = 0,dot = 0,marke = -1;
for(i = start; i <= end; ++i)
{
//cout<<s[i]<<" "<<e<<" "<<dot<<" "<<flag<<endl;
//if(s[i] == '-' || s[i] == '+')return false;可以有正负号,例如1e-3
if(s[i] == 'e')
{
marke = i;++e;
}
else if(s[i] == '.')++dot;
else if(s[i] == '+' || s[i] == '-');
else if(s[i] >= '0' && s[i] <= '9');//不做任何处理
else
return false;
}
//cout<<start<<" "<<end<<" "<<e<<" "<<marke<<" "<<end<<" "<<endl;
if(e > 1 || dot > 1)return false;
if(marke == end)return false;//1e这种非法
if(marke == start)return false;//e9也非法
//经过上面处理还没有退出程序说明字符串中只含有数字或者不超过一个'e','.',但是'+''-'还没处理
if(marke != -1)//指数形式,处理指数部分
{
i = marke+1;
if(s.substr(marke+1,end+1)=="+"||s.substr(marke+1,end+1)=="-")return false;//处理1e+形式
if(s[i] == '-' || s[i] == '+')++i;
while(i <= end)
{
if(s[i] == '-' || s[i] == '+' || s[i] == '.' || s[i] == ' ')return false;
++i;
}
end = marke - 1;
}
//整数部分的正负号之前处理了
string intpart = s.substr(start,end+1);
if(intpart == ".")return false;
for(i = start; i <= end; ++i)
{
if(s[i] == '-' || s[i] == '+' || s[i] == ' ')
return false;
}
return true;
}
};
结果:
执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :6.1 MB, 在所有 C++ 提交中击败了100.00%的用户