剑指 Offer 20. 表示数值的字符串
剑指 Offer 20. 表示数值的字符串
可以用有限自动机
也可以暴力去做,就是提交的次数有点多,我提交了20次。不停的测试所有的边界条件
大体思路是
先判断有没有e
1.有e则用substr()得到前后两个数字str1,str2
2.没有e得到s
写两个判断函数judge1,judge2
judge1:判断小数,整数
judge2:判断整数
结果
1.judge1(str1)&&judge2(str2)
2.judge1(s)
代码
class Solution {
public:
bool judge1(string s)
{
int count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='+'||s[i]=='-')
count++;
}
if(count>1)
return false;
if(count==1)
{
if(s[0]=='+'||s[0]=='-')
{
s=s.substr(1,s.length()-1);
}else
{
return false;
}
}
count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='.')
count++;
}
if(count>1)
return false;
else if(count==1)
{
int index;
for(int i=0;i<s.length();i++)
{
if(s[i]=='.')
index=i;
}
if(index==0)
{
if(s.length()==1)
return false;
else
{
if(s[1]>'9'||s[1]<'0')
return false;
}
}else if(index==s.length()-1)
{
if(s.length()==1)
return false;
else
{
if(s[index-1]>'9'||s[index-1]<'0')
return false;
}
}
else{
if(s[index+1]<='9'&&s[index+1]>='0'&&s[index-1]<='9'&&s[index-1]>='0')
{
}else
{
return false;
}
}
}else
{
if(s.length()==0)
return false;
}
return true;
}
bool judge2(string s)
{
int count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='+'||s[i]=='-')
count++;
}
if(count>1)
return false;
if(count==1)
{
if(s[0]=='+'||s[0]=='-')
{
if(s.length()==1)
return false;
}else
{
return false;
}
}
count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='.')
count++;
}
if(count>0)
return false;
return true;
}
bool isNumber(string s) {
while(s.length()>0)
{
if(s[s.length()-1]==' ')
s=s.substr(0,s.length()-1);
else
break;
}
while(s.length()>0)
{
if(s[0]==' ')
s=s.substr(1,s.length()-1);
else
break;
}
for(int i=0;i<s.length();i++)
{
if(s[i]=='+'||s[i]=='-'||s[i]=='.'||s[i]=='e'||s[i]=='E'||(s[i]>='0'&&s[i]<='9'))
{
}else
{
return false;
}
}
int count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]>='0'&&s[i]<='9')
count++;
}
if(count==0)
return false;
count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='e'||s[i]=='E')
count++;
}
bool flag=true;
if(count>1)
return false;
else if(count==1)
{
if(s.length()<3)
return false;
else
{
int index=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='e'||s[i]=='E')
index=i;
}
string str1=s.substr(0,index);
string str2=s.substr(index+1,s.length()-index-1);
if(str1.length()==0||str2.length()==0)
return false;
flag=judge1(str1)&&judge2(str2);
}
}else
{
flag=judge1(s);
}
return flag;
}
};