当前位置:   article > 正文

基础算法题——估值一亿的AI核心代码(细节拉满)_无论用户说什么,首先把对方说的话在一行中原样打印出来;消除原文中多余空格:把相

无论用户说什么,首先把对方说的话在一行中原样打印出来;消除原文中多余空格:把相
估值一亿的AI核心代码AI

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

1、无论用户说什么,首先把对方说的话在一行中原样打印出来;
2、消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
3、把原文中所有大写英文字母变成小写,除了 I;
4、把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
5、把原文中所有独立的 I 和 me 换成 you;
6、把原文中所有的问号 ? 换成惊叹号 !;
7、在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
输出样例:
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don’t know


这题说真的恶心,要考虑的情况较多,疯狂特判的感觉
(菜是原罪…,请让我慢慢诉说其中细节吧)

解题思路

用题目要求将原文转换为 AI 回答
①、题目要求消除原文中多余空格,把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉。

策略:为了方便删除空格,这里我利用 stringstream 流对字符串以空格进行截取,得到每一个非空格的“单词”(包括一些奇怪的符号,但一定要是有效字符,这里也是一个坑)。

while(getline(ss, tmp, ' ')){
   
		if(tmp[0]>32)	//保证dc中一定是有效字符
			dc[x++]=tmp;
	}
  • 1
  • 2
  • 3
  • 4
  • 5

②、题目要求把原文中所有大写英文字母变成小写,除了 I。

策略:直接扫描字符串,将全部字母字符串转换为小写,当然这里要除了 ‘I’ 以及所有的问号 ? 换成惊叹号 !。(记住一定要转换了,再去判断有没有独立 me或者 you can 或者 you could,我之前就是卡死在这里)

for(int i=0; i<x; i++){
   
			for(int j=0; j<dc[i].size(); j++){
   
				if(dc[i][j]>='A'&&dc[i][j]<='Z'
					&&dc[i][j]!='I')
					dc[i][j] = dc[i][j]+32;
				if(dc[i][j]=='?')
					dc[i][j] = '!';
			}
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

③、题目要求把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词。(记住一定要先转换字母小写了,再判断有没有独立 me或者 you can 或者 you could,我之前就是卡死在这里)

策略:还是扫描每个单词的字符,若符合条件 can you 或 could you 被空格或标点符号分隔开,则替换为 I can 或 I could 。这里也有个坑,就是 you 后面是否存在的有效字符,若存在那就直接替换,否则就要跳过一个单词,避免出现重复替换
(重复替换,例如原文:can you you you 替换后 I I I can,这样是错误的,我们需要避免这种情况)

if(dc[i][j]=='c'){
   
//单独的 can you 
	if(dc[i].substr(j)=="can"
		&&dc[i+1].substr(0,3)=="you")
		if((dc[i+1].size()>3&&dc[i+1][3]<=47)
			||dc[i+1].size()==3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号