题解 | #表示数值的字符串#
表示数值的字符串
https://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8
class Solution {
public:
bool isNumeric(char c)
{
if (c >= '0' && c <= '9')
{
return true;
}
return false;
}
bool isNumeric(string str)
{
//空串
if (str.empty())
{
return false;
}
//去掉前空格
int i = 0;
for(i = 0;i < str.length();i++)
{
if (str[i] != ' ')
{
break;
}
}
str = str.substr(i,str.length() -i);
if (str.empty())
{
return false;
}
//去掉后空格
for(i = str.length() - 1; i >= 0; i--)
{
if (str[i] != ' ')
{
break;
}
}
str = str.substr(0,i + 1);
if (str.empty())
{
return false;
}
//去掉 + - 号
if (str[0] == '+' || str[0] == '-')
{
str = str.substr(1,str.length() - 1);
if (str.empty())
{
return false;
}
}
//数字和'e','.'的处理
bool flag1 = false;
bool flag2 = false;
for(i = 0;i < str.length();i++)
{
//前后至少有一个的数字
if (str[i] == '.')
{
//'.'只能出现一次 以及 小数点后面不能有e
if (flag1 || flag2)
{
return false;
}
flag1 = true;
if (i >= 1 && isNumeric((char)str[i-1]))
{
continue;
}
if (i + 1 < str.length() && isNumeric((char)str[i + 1]))
{
continue;
}
return false;
}
//前后都要是数字(后面的数字可以带正负号)
if (str[i] == 'e' || str[i] == 'E')
{
//'e'只能出现一次
if (flag2)
{
return false;
}
flag2 = true;
//前面的数字可以是小数
if (i >= 1 && (isNumeric((char)str[i-1]) || str[i-1] == '.'))
{
//后面的数字可以带正负号
if (str[i + 1] == '-' || str[i + 1] == '+')
{
//跳过这个字符的检查
i++;
}
if(i + 1 < str.length() && isNumeric((char)str[i + 1]))
{
continue;
}
}
return false;
}
//其他的只能是数字
if(!isNumeric((char)str[i]))
{
return false;
}
}
return true;
}
};
