基础算法题——估值一亿的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;
	}

②、题目要求把原文中所有大写英文字母变成小写,除了 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] = '!';
			}
		}

③、题目要求把原文中所有独立的 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值