估值一个亿的AI核心代码(超容易理解的做法)
原题
解题思路
解题过程基本就是对输入的字符串轮流进行题目要求中的处理,删空格、转化大小写、替换字符等等。
难点易错点以及解决思路
个人认为最大的难点是字符替换中’I’和’you’的重复替换问题,但是其实解决起来还是简单的,我的办法是替换的时候先用大写You替换I,这样就避免了’you’可能再次被换。只需要在替换完之后再次转化大小写即可。
易错点主要是在替换过程中的条件判断,比如对" 独立的’can you’ "的理解,判断过程中可能会遇到数组越界以及逻辑不清楚判断不完整等问题,我的理解就是利用STL的find()来找到索引后开始判断边界字符,用isdigit()、isalpha()来判断是否为空格以及判断边界可能得出独立与否的结论。
c++参考代码
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
void upper2lower(string &s)//小写转化
{
for(int i = 0;i <= s.size();i ++)
if(s[i] >= 'A' && s[i] <= 'Z' && s[i] != 'I') s[i] -= 'A' - 'a';
}
void spacedelete(string &s)//删除多余空格
{
while(s[0] == ' ') s.erase(0,1);//行首多余空格
while(s[s.length() - 1] == ' ') s.erase(s.length()-1,1);//末尾多余空格
for(int i = 1;i < s.length();i ++)
{
if(s[i] == ' ' && s[i - 1] == ' ')//空格不相连
s.erase(-- i,1);
else if(!isalpha(s[i]) && !isdigit(s[i]) && s[i] != ' ' && s[i - 1] == ' ')//符号前不留空格
s.erase(-- i,1);
}
}
void strchange(string &s,string pre,string rep)//字符替换
{
int index = 0;
do
{
index = s.find(pre,index);
if(index == -1) break;
if(index != 0 && (isalpha(s[index - 1]) || isdigit(s[index - 1])))
{
index ++;
continue;
}
int right = index + pre.size();
if(right < s.length() && (isalpha(s[right]) || isdigit(s[right])))
{
index ++;
continue;
}
s.replace(index,pre.size(),rep);
} while (index != -1);
}
void ans(string s)
{
cout << s<< endl;
spacedelete(s);//多余空格删除
upper2lower(s);//大小写转化
strchange(s,"I","You");
strchange(s,"me","You");
strchange(s,"can you","I can");
strchange(s,"could you","I could");
//字符替换
for(int i = 0;i < s.length();i ++) s[i] = s[i] == '?'?'!':s[i];//?换!
upper2lower(s);//大小写转化
cout << "AI: " << s << endl;///输出回答
}
int main()
{
int t;
cin >> t;
getchar();
while(t --)
{
string ask;
getline(cin,ask);
ans(ask);
}
return 0;
}