当前位置:   article > 正文

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

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

一、题目

二、解题思路

  1. 消除原文中多余空格:通过字符串的 find 函数找到字符串中空格出现的位置,从位置 t 开始查找 pos=str.find(" ",t) ;如果结果的下一个字符依旧为空格,表示有多余空格,则删除,或者处于行首尾,也要删除 (judge(pos+1,str) || pos==0 || pos==str.length()-1),否则表示此时的空格都是合法的,记录此时的位置 ,下次查找从位置 t 开始 t=pos+1,直至找不到空格退出循环。
  2. 把原文中所有大写英文字母变成小写,除了 I:str[i]+=32 。
  3. 把原文中所有的问号 ? 换成惊叹号 !:str[i]='!' 。
  4. can you ,could you 对应地换成 I can,I could ,I 和 me 换成 you :判断输出,“独立的”要求前后都为处于句首、空格、标点符号之一。

三、代码

  1. #include<iostream>
  2. using namespace std;
  3. bool judge(int x,string str);
  4. int main()
  5. {
  6. int n;
  7. cin>>n;
  8. getchar();
  9. while(n--)
  10. {
  11. string str;
  12. getline(cin,str);
  13. // 无论用户说什么,首先把对方说的话在一行中原样打印出来
  14. cout<<str<<endl;
  15. // 消除原文中多余空格:把相邻单词间的多个空格换成 1个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉
  16. int t=0;
  17. while(1)
  18. {
  19. int pos=str.find(" ",t);
  20. if(pos!=-1)
  21. {
  22. if(judge(pos+1,str) || pos==0 || pos==str.length()-1)
  23. {
  24. str.erase(pos,1);
  25. }
  26. else
  27. {
  28. t=pos+1;
  29. }
  30. }
  31. else
  32. {
  33. break;
  34. }
  35. }
  36. // 把原文中所有大写英文字母变成小写,除了 I
  37. // 把原文中所有的问号 ? 换成惊叹号 !
  38. for(int i=0;i<str.length();i++)
  39. {
  40. if(str[i]>='A' && str[i]<='Z' && str[i]!='I')
  41. {
  42. str[i]+=32;
  43. }
  44. else if(str[i]=='?')
  45. {
  46. str[i]='!';
  47. }
  48. }
  49. // 把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词
  50. // 把原文中所有独立的 I 和 me 换成 you
  51. // 在一行中输出替换后的句子作为 AI 的回答
  52. cout<<"AI: ";
  53. for(int i=0;i<str.length();)
  54. {
  55. bool pre=(i==0 || str[i-1]==' ' || judge(i-1,str));
  56. if(str.substr(i,7)=="can you" && pre && (i==str.length() || str[i+7]==' ' || judge(i+7,str)))
  57. {
  58. cout<<"I can";
  59. i+=7;
  60. }
  61. else if(str.substr(i,9)=="could you" && pre && (i==str.length() || str[i+9]==' ' || judge(i+9,str)))
  62. {
  63. cout<<"I could";
  64. i+=9;
  65. }
  66. else if(str.substr(i,1)=="I" && pre && (i==str.length() || str[i+1]==' ' || judge(i+1,str)))
  67. {
  68. cout<<"you";
  69. i+=1;
  70. }
  71. else if(str.substr(i,2)=="me" && pre && (i==str.length() || str[i+2]==' ' || judge(i+2,str)))
  72. {
  73. cout<<"you";
  74. i+=2;
  75. }
  76. else
  77. {
  78. cout<<str[i];
  79. i+=1;
  80. }
  81. }
  82. cout<<endl;
  83. }
  84. return 0;
  85. }
  86. //字母和数字返回 0 ,否则返回 1
  87. bool judge(int x,string str)
  88. {
  89. return (!((str[x]>='a' && str[x]<='z') || (str[x]>='A' && str[x]<='Z') || (str[x]>='0' && str[x]<='9')));
  90. }

四、总结

  1. pos=str.find(" ",t) :查找第一次出现位置,从 t 开始查找。
  2. can you ,could you 对应地换成 I can,I could ,I 和 me 换成 you :开始想的是直接修改,但发现两者之间会相互影响,所以不行,应该在输出时判断。
  3. 判断是否是标点符号:不是字母和数字字符。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号