题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路:
以E或e为节点,将字符串分成前后两部分,前面的部分可以有小数点,后面的部分不能有小数点。去除正负号后,以小数点为界限再次将字符串分为前后两部分,判断每一部分是不是只有数字。
class Solution {
public:
bool isNumeric(char* string)
{
if (string==NULL)
return false;
int i;
vector<char>s1,s2; //以E或e为节点,将字符串分为前后两部分
for(i=0;;i++) //找出E或e位置
{
if(*(string+i)=='E'||*(string+i)=='e'||*(string+i)=='\0')
break;
}
if(*(string+i)=='E'||*(string+i)=='e')
{
for(int j=0;j<i;j++)
s1.push_back(*(string+j));
for(int j=i+1;*(string+j)!='\0';j++)
s2.push_back(*(string+j));
if(s1.size()==0||s2.size()==0)//字符串中存在E或e,那么E或e前后字符串不能为空
return false;
return IsNumOfFirst(s1)&&IsNumOfLast(s2);
}
else//(str[i]=='\0')
{
for(int j=0;j<i;j++)
s1.push_back(*(string+j));
return IsNumOfFirst(s1);
}
}
bool IsNumOfFirst(vector<char> s)//用于判断E或e之前的字符串是否符合要求
{
int len=s.size();
if(len==0)
return false;
string front="",last="";//以小数点为界限,将字符串分为前后两部分
int havepoint=0; //有没有小数点的标记
if(s[0]=='+'||s[0]=='-')//第一个字符是正负号
{
//if(s[1]<'0'||s[1]>'9')//+.3合法,正负号后面可以直接跟小数点
// return false;
int i;
for(i=1;i<len;i++)
{
if(s[i]=='.'){havepoint=1;break;}
front=front+s[i];
}
i++;//越过小数点
for(;i<len;i++)
last=last+s[i];
//if((front==""||last=="")&&havepoint==1)
if(last==""&&havepoint==1) //有小数点,小数点后面不能为空
return false;
if(front==""&&havepoint==0) //不能只有一个正负号
return false;
return isnum(front) && isnum(last);
}
else //第一个字符不是正负号
{
int i;
for(i=0;i<len;i++)
{
if(s[i]=='.'){havepoint=1;break;}
front=front+s[i];
}
i++;//越过小数点
for(;i<len;i++)
last=last+s[i];
//if((front==""||last=="")&&havepoint==1)
if(last==""&&havepoint==1)//有小数点,小数点后面不能为空
return false;
//if(front==""&&havepoint==0)
// return false;
return isnum(front) && isnum(last);
}
}
//用于判断E或e之后的字符串是否符合要求
bool IsNumOfLast(vector<char> vec) //E或e之后一定没有小数点
{
int len=vec.size();
if(len==0)
return false;
string s="";
if(vec[0]=='+'||vec[0]=='-') //第一个字符是正负号
{
for(int i=1;i<len;i++)
s=s+vec[i];
if(s=="") //不能只有一个正负号
return false;
}
else//第一个字符不是正负号
{
for(int i=0;i<len;i++)
s=s+vec[i];
}
return isnum(s);
}
bool isnum(string str)//判断一串字符是不是由0-9字符构成
{
int len=str.size();
for(int i=0;i<len;i++)
if(str[i]<'0'||str[i]>'9')
return false;
return true;
}
};