class Solution {
public:
//return the offset of . from start, if not float, return -1;
int isFloat(int start,int end,const char* s)
{
//float at least contains a . and a number
if(start>=end)
{
return -1;
}
if((s[start]=='+')||(s[start]=='-'))
{
start++;
}
if(start>=end)
{
return -1;
}
int dotPos=-1;
for(int i=start;i<=end;++i)
{
if(s[i]=='.')
{
if(dotPos==-1)
{
dotPos=i;
}
else
{
return -1;
}
}
else if((s[i]<'0')||(s[i]>'9'))
{
return -1;
}
else
{
continue;
}
}
//calc offset
if(dotPos!=-1)
{
dotPos=dotPos-start;
}
return dotPos;
}
bool isInteger(int start,int end,const char* s)
{
if(start>end)
{
return false;
}
if(s[start]=='+'||s[start]=='-')
{
start++;
}
if(start>end)
{
return false;
}
for(int i=start;i<=end;++i)
{
if((s[i]<'0')||(s[i]>'9'))
{
return false;
}
}
return true;
}
bool isNumber(const char *s) {
int len=strlen(s);
//left trim
int start=0;
for(;start<len;++start)
{
if(s[start]==' ')
{
continue;
}
else
{
break;
}
}
//right trim
int end=len-1;
for(;end>=0;--end)
{
if(s[end]==' ')
{
continue;
}
else
{
break;
}
}
if(start>end)
{
return false;
}
//find the pos of e(E) if it is exist,before e is a integer or float,after e is a integer
int ePos=-1;
for(int i=start;i<=end;++i)
{
if((s[i]=='e')||(s[i]=='E'))
{
ePos=i;
break;
}
}
if(ePos==-1)
{
if(isInteger(start,end,s))
{
return true;
}
if(isFloat(start,end,s)!=-1)
{
return true;
}
return false;
}
else
{
if(isInteger(ePos+1,end,s))
{
if(isInteger(start,ePos-1,s))
{
return true;
}
int pos=isFloat(start,ePos-1,s);
if(pos!=-1)
{
return true;
}
}
return false;
}
}
};
题目本身不难,只要细心处理好逻辑判断就好。首先要把最前面和最后面的空白去掉,然后判断是否是用科学计数法表示的,如果不是,直接判断是否为整数或者浮点数;如果是用科学计数法表示的,则e后边必须为整数,e前边为整数或浮点数。