L1-064 估值一亿的核心代码

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值