当科学计数法时
必须前面后面都有数字,且可以带正负号,前面的digit 可以是小数
{digit}e{digit}
example:
2e10
-2e-3
2.3e1
4.e2
.2e81
-.2e91
小数的表示
1.0
1.
.1
-.1
+.8
class Solution {
public:
bool isdig(string s)
{
int n=s.size();
int i=0;
if(n==0||s=="-"||s=="+")
return false;
if(s[i]=='-'||s[i]=='+')
i++;
for(;i<n&&isdigit(s[i]);i++);
if(i>=n)
return true;
return false;
}
bool isNumber(string s) {
int n=s.size();
int i,j,k;
for(i=0;i<n&&s[i]==' ';i++);
if(i>=n)
return false;
for(j=n-1;j>=0&&s[j]==' ';j--);
s=s.substr(i,j-i+1);
n=s.size();
bool find=false;
char op=' ';
int ind=0;
for(k=0;k<n;k++)
{
if(s[k]=='.'||s[k]=='e')
{
find=true;
op=s[k];
ind=k;
break;
}
}
if(!find)
{
return isdig(s);
}
else
{
if(op=='e')
{
if(isdig(s.substr(0,k))&&isdig(s.substr(k+1)))
return true;
}
else
{
if(k+1<n&&(s[k+1]=='-'||s[k+1]=='+'))
return false;
string left=s.substr(0,k);
string right=s.substr(k+1);
if((isdig(left)||left==""||left=="+"||left=="-")&&isdig(right))
return true;
if(isdig(left)&&right=="")
return true;
int t=0;
for(t=0;t<right.size()&&right[t]!='e';t++);
if(t<right.size()&&right[t]=='e')
{
string l=right.substr(0,t);
string r=right.substr(t+1);
if(isdig(left)&&isdig(r)&&(l==""||isdig(l)))
return true;
if(isdig(l)&&isdig(r)&&(left==""||left=="-"||left=="+"))
return true;
}
}
}
return false;
}
};
update:
边界考虑
class Solution {
public:
bool isNumber(string s) {
bool hasDig=false,hasDot=false,hasE=false,hasop=false,nedDig=false;
int n=s.size();
int i=0;
while(i<n&&s[i]==' ')
i++;
for(;i<n&&s[i]!=' ';i++)
{
if(s[i]>='0'&&s[i]<='9')
{
nedDig=false;
hasDig=true;
}
else if(s[i]=='+'||s[i]=='-')
{
nedDig=true;
if(i-1>=0&&s[i-1]=='e')
continue;
if(hasDig||hasDot||hasE||hasop)
return false;
hasop=true;
}
else if(s[i]=='.')
{
if(hasDot||hasE)
return false;
hasDot=true;
}
else if(s[i]=='e')
{
if(!hasE&&hasDig)
{
nedDig=true;
hasE=true;
continue;
}
else
return false;
}
else
return false;
}
while(i<n&&s[i]==' ')
i++;
return hasDig&&i>=n&&!nedDig;
}
};