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

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

有坑!不少

题目链接

题目及分析

题目:
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
      1. 无论用户说什么,首先把对方说的话在一行中原样打印出来;
      2. 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
      3. 把原文中所有大写英文字母变成小写,除了 I;
      4. 把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
      5. 把原文中所有独立的 I 和 me 换成 you;
      6. 把原文中所有的问号 ? 换成惊叹号 !;
      7. 在一行中输出替换后的句子作为 AI 的回答

直接思路(有BUG)

首先按照规则一对一的想出解决方案:

  1. 首先直接输出原话(废话)
  2. 然后删除多余空格
          2.1 先删除行首行尾空格,用while一直判断是否为空格就行
          2.2 单词间和符号前的空格,遍历字符串,找到空格后,如果下一个也是空格,就删除当前空格;如果下一个为标点符号或者单词,就不删除
  3. 遍历字符串,将大写英文字母转换为小写,'I' 不做处理
  4. 找到空格或者标点符号后的can you,could you,然后替换为 I can,I could(坑点来袭,下面会介绍坑点)
  5. 基本同4 空格或者标点符号后的I,me 替换为you
  6. 遍历字符串,将?替换为!
  7. 输出处理结果

逻辑分析一波
执行顺序应该为1->2.1->2.2,3,6->4,5->7

坑点

  1. 执行顺序处:处理空格和大小写不能和替换放在一个循环中!!!不然空格+大小写不好替换
  2. 替换字符串时,替换的必须是 独立 的字符串!!!如can you前面和后面都必须是空格或者是字符串,但是有一种特殊情况! can you在字符串的末尾,所以需要对这种也要处理
  3. 特殊情况:当两个标点符号中有许多空格,按照规则来说,输出的时候中间是不留空格的!输出时需注意!!!判断当前位如果是空格,并且是下一位是符号,不输出此空格。

AC代码

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
//@date: 2020-02-01 11:58:40
//@state:YES

int judge(char c)
{//判断传入的字符是什么
    if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
        return 1;//字母
    else if(c>='0'&&c<='9')
        return 2;//数字
    else if(c==' ')
        return 0;//空格
    else if(c>=33&&c<=126)
        return -1;//标点符号
    return 99;//默认值
}

string AI(string ask)
{//返回处理结果
    //删除行首空格
    while(ask[0]==' ')
        ask.erase(ask.begin());
    //删除行尾空格
    while(ask[ask.size()-1]==' ')
        ask.erase(ask.end()-1);
    
    for(int i=0;i<ask.size();i++)
    {
        //大写变小写
        if(ask[i]>='A'&&ask[i]<='Z'&&ask[i]!='I')
            ask[i]+=32;
        //?->!
        if(ask[i]=='?')
            ask[i]='!';
        //删除多余空格
        if(ask[i]==' ')
        {
            int j=i+1;
            while(ask[j]==' ') j++;
            ask.erase(ask.begin()+i+1,ask.begin()+j);//此处参数必须为迭代器,int不行
        }
    }
    //替换字符串
    for(int i=0;i<ask.size();i++)
    {
        if(i==0)
        {
            if(ask[i]=='I'&&(judge(ask[i+1])<=0||i+1==ask.size()))
                ask.replace(i,1,"you");
            else if(ask.substr(i,2)=="me"&&(judge(ask[i+2])<=0||i+2==ask.size()))
                ask.replace(i,2,"you");
            else if(ask.substr(i,7)=="can you"&&(judge(ask[i+7])<=0||i+7==ask.size()))
                ask.replace(i,7,"I can");
            else if(ask.substr(i,9)=="could you"&&(judge(ask[i+9])<=0||i+9==ask.size()))
                ask.replace(i,9,"I could");
        }
        if(judge(ask[i])<=0)
        {
            if(judge(ask[i+1])==1)//字母
            {
                if(ask[i+1]=='I'&&(judge(ask[i+2])<=0||i+2==ask.size()))
                    ask.replace(i+1,1,"you");
                if(ask.substr(i+1,2)=="me"&&(judge(ask[i+3])<=0||i+3==ask.size()))
                    ask.replace(i+1,2,"you");
                if(ask.substr(i+1,7)=="can you"&&(judge(ask[i+8])<=0||i+8==ask.size()))
                    ask.replace(i+1,7,"I can");
                if(ask.substr(i+1,9)=="could you"&&(judge(ask[i+10])<=0||i+10==ask.size()))
                    ask.replace(i+1,9,"I could");
            }
        }
    }

    return ask;
}

int main()
{
    int n;
    string ask,ans;
    cin>>n;
    cin.get();
    while(n--)
    {
        getline(cin,ask);
        cout<<ask<<endl;
        ans=AI(ask);
        cout<<"AI: ";
        for(int i=0;i<ans.size();i++)
        {
            //判断符号+空格+符号的特殊情况
            if(ans[i]==' '&&judge(ans[i+1])<=0)
                continue;
            else
                cout<<ans[i];
        }
        cout<<endl;
    }
    return 0;
}
posted @ 2020-02-03 22:01  熊子q  阅读(407)  评论(0编辑  收藏  举报