题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路
面向测试用例程序设计
考虑不符合数值的特征:
1.除e或E之外的其他字母
2.e或E有多个
3.有多个小数点,或者小数点出现在e或E之后
3.正负号出现在非首部或者非e后面
总体思路就是这样,在实现的时候需要考虑判断顺序。
1.判断0和9的数字是最简单的,放在最后判断
2.考虑有无e或者E才方便判断小数点和正负号在不在e后面,因此先对e进行判断
实现
class Solution {
public:
bool isNumeric(string str) {
// write code here
bool p_n=0,point=0,has_e=0;
int len=str.length();
for (int i=0;i<len;i++)
{
if (str[i]=='e'||str[i]=='E')
{
if (has_e||i==len-1)//如果已经有e了,或者e出现在字符串末尾,返回false
return 0;
else//否则就把e的标志位置为1
has_e=1;
}
else if (str[i]=='.')
{
if (point||has_e)如果有小数点了,或者有e了(代表此时的小数点出现在e后面),返回false
return 0;
else//否则把小数点标志置1
point=1;
}
else if (str[i]=='-'||str[i]=='+')
{
if (p_n&&(str[i-1]!='e'&&str[i-1]!='E')) return 0;//如果有正负号了,并且此时的正负号前面一个不是e,返回false
else if (p_n==0&&i!=0&&(str[i-1]!='e'&&str[i-1]!='E')) return 0;//如果没有正负号,并且此时的正负号出现不是在头部,并且前面也没有e,返回false
else p_n=1;//否则正负号标志置1
}
else if (str[i]<'0'||str[i]>'9')//上面判断过之后,出现09以外的,返回false
return 0;
}
return 1;//测试都通过,返回true
}
};