L1-064 估值一亿的核心代码
题目链接 团体程序设计天梯赛第64题
做这个题时一直有个测试点(1号测试点,即第二个测试点) 过不了,看了一些其他人的代码和解题思路也找不出问题来,最后再回来看了看题目,原来是自己一直理解错了,对字符串的修改一定都要在原文的基础上改。我做的时候错误在于把”I“、”me"改成“you"之后再对修改后的句子中的”can you"、“could you"改成"I can"和“I could”,这样的话万一原文中有"can I"的话就出问题了,按我的做法结果会是"I can",但正确的应该是“can you"。
我最后的AC代码如下,
#include <iostream>
#include<iomanip>
#include<string>
#include<ctype.h>
using namespace std;
string change(string result,string c1,string c2);//将result 中的独立的c1换成c2
void handle(string s);//处理并输出
int main()
{
int n;
string s;
cin>>n;
cin.ignore();
while(n--)
{
getline(cin,s);
handle(s);
}
return 0;
}
void handle(string s)
{
cout<<s<<endl;
//去空格
string result;
int flag=0;
for(int i=0;i<s.length();++i)
{
//如果是空格就不加入result
if(s[i]!=' ')
{
if(s[i]=='?')
s[i]='!';//将问号改成叹号
if(flag==0||!(isalnum(s[i])))
result+=s[i];//如果s[i]前面不是空格或者s[i]是标点符号 ,直接加入
else
result=result+" "+s[i];//否则加入一个空格和s[i]
flag=0;
}
else
flag=1;
}
if(result[0]==' ')
result.erase(0,1);
//换成小写
for(int i=0;i<result.length();++i)
{
if(isalpha(result[i])&&result[i]!='I')
result[i]=tolower(result[i]);
}
result=change(result,"could you","# could");//利用#代替I,防止后面再把I改成you
result=change(result,"can you","# can");
result=change(result,"I","you");
result=change(result,"me","you");
result=change(result,"#","I");
cout<<"AI: ";
cout<<result<<endl;
}
string change(string result,string c1,string c2)
{
int m=result.find(c1);//找到第一次出现c1的下标
int flag=0;
while(m>=0)
{
if(m+c1.length()==result.length())
{
if(m==0)
{
result.erase(m,c1.length());
result.insert(m,c2);
break;
}
else if(!(isalnum(result[m-1])))
{
result.erase(m,c1.length());
result.insert(m,c2);
break;
}
}
else
{
//m=0只需要检查单词后面是不是字符或数字 来判断是否独立
if(m==0&&!(isalnum(result[m+c1.length()])))
{
result.erase(m,c1.length());
result.insert(m,c2);
flag=1;
}
//m!=0两端都要判断
else if(m!=0&&!(isalnum(result[m-1])||isalnum(result[m+c1.length()])))
{
result.erase(m,c1.length());
result.insert(m,c2);
flag=1;
}
if(flag)
m=result.find(c1,m+c2.length());
else
m=result.find(c1,m+c1.length());
}
}
return result;
}