• 计蒜客详解合集(1)期


     以后对于简单题目,大致6道题目出一期,稍有难度的才单独一期发布~

    目录

    T1266——出勤记录

    T1170——人民币支付 

    T1122——最长最短单词 

    T1115——字符串判等

    T1116——验证子串 

    T1118——删除单词后缀 


    T1266——出勤记录

    • 小蒜的算法课老师每次上课都会统计小蒜的出勤记录。迟到会被记录一个L,缺席会被记录一个 A,按时上课会被记录一个0。学期结束,小蒜的出勤记录可以看成是一个只包含LAO 的字符串,例如"O0OOLOOOLALLO....."如果小蒜整学期缺席不超过 1 次,并且没有连续 3 次迟到,小蒜的出勤记录就算合格。现在给出小蒜的出勤记录,你能判断他是否合格么?输入格式
    • 输入第一行包含一个整数 T(1 < =T<=10),代表测试数据的组数以下工行每行一个程度不超过 100 的字符串 S,代表小蒜的出勤记录输出格式
    • 对于每一份出勤记录,输出“YES”或者“NO”表示该份记录是否合格.

    水题,唯一考验操作水平的只有同级连续字符串最大值这一操作,解决方式如下: 

    1. int late=-1; //连续缺勤的次数
    2. int max=0;//最长连续的L
    3. //缺勤检验
    4. for(int k=0;k<=temp.size()-1;k++)
    5. {
    6. if(temp[k]=='L'&&late==-1)
    7. {
    8. late=1;//当前是连续的第一个迟到记录
    9. }
    10. else if(temp[k]=='L'&&late!=-1)
    11. {
    12. //不为-1意味着当前不是第一个连续的迟到记录,所以直接加一就好
    13. late++;
    14. }
    15. else if(temp[k]!='L')
    16. {
    17. //如果不为k,则直接清零重新计数
    18. if(late>max)
    19. max=late;
    20. late=-1;
    21. }
    22. }
    23. L.push_back(max);

    全文代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(int argc, char** argv) {
    6. int num=0;
    7. cin>>num;
    8. vector<int> V;
    9. vector<int> L;
    10. for(int i=1;i<=num;i++)
    11. {
    12. string temp;
    13. cin>>temp;
    14. int count=0;// 缺勤次数
    15. //缺勤检验
    16. for(int j=0;j<=temp.size()-1;j++)
    17. {
    18. if(temp[j]=='A')
    19. count++;
    20. }
    21. V.push_back(count);
    22. int late=-1; //连续缺勤的次数
    23. int max=0;//最长连续的L
    24. //缺勤检验
    25. for(int k=0;k<=temp.size()-1;k++)
    26. {
    27. if(temp[k]=='L'&&late==-1)
    28. {
    29. late=1;//当前是连续的第一个迟到记录
    30. }
    31. else if(temp[k]=='L'&&late!=-1)
    32. {
    33. //不为-1意味着当前不是第一个连续的迟到记录,所以直接加一就好
    34. late++;
    35. }
    36. else if(temp[k]!='L')
    37. {
    38. //如果不为k,则直接清零重新计数
    39. if(late>max)
    40. max=late;
    41. late=-1;
    42. }
    43. }
    44. L.push_back(max);
    45. }
    46. for(int i=0;i<=num-1;i++)
    47. {
    48. if(V[i]<=1&&L[i]<3)
    49. cout<<"YES"<
    50. else
    51. cout<<"NO"<
    52. }
    53. return 0;
    54. }

    T1170——人民币支付 

    • 蒜头君指定一金额(以元为单位,如 345),想次道文付该金额的各种面源的人民币量,显示 100 元,50元,20元,10元,5元,1元各多少张,要求尽量使用大面额的钞票
    • 输入格式:个小于 1000 的正整数
    • 输出格式:输出分行,每行显示一个整数,从上到下分别表示 100 元,50元,20 元,10元,5元,1元人民币的张数~

    超级水,不解释,代码的处理方式减低了繁琐程度

    1. #include
    2. using namespace std;
    3. int main(int argc, char** argv) {
    4. int num=0;
    5. cin>>num;
    6. int money[6]={100,50,20,10,5,1};
    7. for(int i=0;i<=5;i++)
    8. {
    9. int count=0;
    10. count=num/money[i];
    11. num-=money[i]*count;
    12. cout<
    13. }
    14. return 0;
    15. }

    T1122——最长最短单词 

    • 输入1行句子(不多于 200 个单,每个单长度不超过 100),只包含字母和空格。单由至少一个连续的字母构成,空格和逗号都是单词间的间隔。试输出第 1 个最长的单词和第 1 个最短单词。
    • 输入格式:1行句子。
    • 输出格式:两行输出:第 1行,第一个最长的单词。第 2 行,第一个最短的单词.
    • 提示:如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词.

            又是一道水题,基本思路是从目标串中根据空格分离出来每一个单词,然后分别找出最大值与最小值,输出即可~

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(int argc, char** argv) {
    6. string S;
    7. vector V;
    8. getline(cin,S);
    9. string temp;
    10. //分割单词
    11. for(int i=0;i<=S.size()-1;i++)
    12. {
    13. temp+=S[i];
    14. if(S[i]==' '||i==S.size()-1)
    15. //最后一个单词要有单独的操作
    16. {
    17. V.push_back(temp);
    18. temp.clear();
    19. }
    20. }
    21. //删除除了最后一个单词以外,末尾的空格
    22. for(int i=0;isize()-1;i++)
    23. {
    24. string temp=V[i];
    25. temp.erase(temp.size()-1);
    26. V[i]=temp;
    27. }
    28. // cout<
    29. // for(int i=0;i<=V.size()-1;i++)
    30. // {
    31. // cout<
    32. // }
    33. // 检验单词长度
    34. // cout<
    35. int max=V[0].size(),maxt=0;
    36. int min=V[0].size(),mint=0;
    37. //两类辅助变量
    38. for(int i=0;i<=V.size()-1;i++)
    39. {
    40. //判断是否大于当前
    41. if(V[i].size()>max)
    42. {
    43. max=V[i].size();
    44. maxt=i;
    45. }
    46. //判断是否小于当前
    47. if(V[i].size()
    48. {
    49. min=V[i].size();
    50. mint=i;
    51. }
    52. }
    53. cout<
    54. cout<
    55. return 0;
    56. }

    T1115——字符串判等

    • 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等.
    • 输入格式:两行,每行包含一个字符串;字符串长度不超过 100。
    • 输出格式:若两个字符串相等,输出“YES”否则输出“NO“ 

    水题不解释,考研复习压力偶尔写一道换换心情还不错~

    这里有一个比较有趣的知识点,对于同时输入多个字符串时还要允许空格的输入,那么普通的cin函数就不能满足要求了,这里采用getline函数解决,如下:

    1. string s1,s2;
    2. getline(cin,s1);
    3. getline(cin,s2);

    剔除字符串中的空格

    1. string DeBlack(string s)
    2. {
    3. string n;
    4. for(int i=0;i<=s.size()-1;i++)
    5. if(s[i]!=' ')
    6. n+=s[i];
    7. return n;
    8. }

    统一字符为大写

    1. string ConDX(string s)
    2. {
    3. for(int i=0;i<=s.size()-1;i++)
    4. if(s[i]>=97&&s[i]<=122)
    5. s[i]=s[i]-32;
    6. return s;
    7. }

    判断字符串是否相等

    1. int DoQua(string s1,string s2)
    2. {
    3. if(s1.size()!=s2.size())
    4. return -1;
    5. for(int i=0;i<=s1.size()-1;i++)
    6. {
    7. if(s1[i]!=s2[i])
    8. return -1;
    9. }
    10. return 1;
    11. }

    如下是完整代码,使用前调试的结果正确

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. string DeBlack(string s)
    6. {
    7. string n;
    8. for(int i=0;i<=s.size()-1;i++)
    9. if(s[i]!=' ')
    10. n+=s[i];
    11. return n;
    12. }
    13. string ConDX(string s)
    14. {
    15. for(int i=0;i<=s.size()-1;i++)
    16. if(s[i]>=97&&s[i]<=122)
    17. s[i]=s[i]-32;
    18. return s;
    19. }
    20. int DoQua(string s1,string s2)
    21. {
    22. if(s1.size()!=s2.size())
    23. return -1;
    24. for(int i=0;i<=s1.size()-1;i++)
    25. {
    26. if(s1[i]!=s2[i])
    27. return -1;
    28. }
    29. return 1;
    30. }
    31. int main(int argc, char** argv)
    32. {
    33. string s1,s2;
    34. getline(cin,s1);
    35. getline(cin,s2);
    36. string n1=DeBlack(s1);
    37. n1=ConDX(n1);
    38. string n2=DeBlack(s2);
    39. n2=ConDX(n2);
    40. // cout<
    41. int ans=DoQua(n1,n2);
    42. if(ans==1)
    43. cout<<"YES"<
    44. else
    45. cout<<"NO"<
    46. return 0;
    47. }

     

    T1116——验证子串 

    • 输入两个字符串,验证其中一个串是否为另一个串的子串。
    • 输入格式:输入两个字符串,每个字符串占一行,长度不超过 200且不含空格~
    • 输出格式:若第一个串 S1 是第二个串 2 的子串,则输出"(s1) is substring of (s2)"否则,若第二个串 s2是第一个串s1的子串,输出(s2) is substring of (s1)“否则,输出“No substring"

            C++实现验证子串的功能:今天复习了一下数据结构的串部分的内容,突然想起来子串匹配的实现,于是计蒜客随便找一道题写一下,核心的代码为裁剪子串和字符串比较两个内容,建议理解+背诵,考研大概率会考。

    子串裁剪

    1. string Sfind(string s,int pos,int len)
    2. {
    3. string temp;
    4. for(int i=pos;i
    5. {
    6. temp+=s[i];
    7. }
    8. return temp;
    9. }

    如上,传入3个参数:目标字符串,开始裁剪的位置下标,以及裁剪字符的个数,最后返回值为裁剪好的字符串子串。

    子串比较

    1. int Scmp(string sa,string sb)
    2. {
    3. int ans=0;
    4. for(int i=0;i<=sa.length()-1;i++)
    5. {
    6. if(sa[i]!=sb[i])
    7. {
    8. ans=sa[i]-sb[i];
    9. return ans;
    10. }
    11. }
    12. ans=sa.length()-sb.length();
    13. return ans;
    14. }

    如上,将需要比较的两个字符串传入,定义返回值为整型,当返回值为0时,字符串相等,而返回正值则代表前者大,负值则说明后者大;如果匹配的字符完全相等但长度不同,则认为长的字符串更大一些。 

    完整代码如下:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    6. string Sfind(string s,int pos,int len)
    7. {
    8. string temp;
    9. for(int i=pos;i
    10. {
    11. temp+=s[i];
    12. }
    13. return temp;
    14. }
    15. int Scmp(string sa,string sb)
    16. {
    17. int ans=0;
    18. for(int i=0;i<=sa.length()-1;i++)
    19. {
    20. if(sa[i]!=sb[i])
    21. {
    22. ans=sa[i]-sb[i];
    23. return ans;
    24. }
    25. }
    26. ans=sa.length()-sb.length();
    27. return ans;
    28. }
    29. int main(int argc, char** argv)
    30. {
    31. string s1,s2;
    32. cin>>s1;
    33. cin>>s2;
    34. if(s1.length()>=s2.length())
    35. {
    36. int f1=0;
    37. for(int i=0;i<=s1.size()-1;i++)
    38. {
    39. string temp=Sfind(s1,i,s2.length());
    40. if(Scmp(s2,temp)==0)
    41. {
    42. cout<" is substring of "<
    43. f1=1;
    44. break;
    45. }
    46. }
    47. if(f1==0)
    48. cout<<"No substring"<
    49. }
    50. else if(s1.length()length())
    51. {
    52. int f1=0;
    53. for(int i=0;i<=s2.size()-1;i++)
    54. {
    55. string temp=Sfind(s2,i,s1.length());
    56. if(Scmp(s1,temp)==0)
    57. {
    58. cout<" is substring of "<
    59. f1=1;
    60. break;
    61. }
    62. }
    63. if(f1==0)
    64. cout<<"No substring"<
    65. }
    66. return 0;
    67. }


    T1118——删除单词后缀 

    • 给定一个单词,如果该单词以 er 、1y 或者 ing 后缀结尾,则删除该后(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作。
    • 输入格式:输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为 32) 。
    • 输出格式:输出按照题目要求处理后的单词。 

            也是水题,考察对基本功的运用程度。此处采用三个独立的if语句,来分别判断是否删除相应的后缀。局限性在于使用了goto语句——一般情况下不建议这么做。此处改为whlie循环嵌套3个if语句用break输出也可以,大家自行尝试,不再一一赘述。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(int argc, char** argv) {
    6. string S;
    7. cin>>S;
    8. int n=S.length();
    9. vector<char> V;
    10. for(int i=0;i<=n-1;i++)
    11. {
    12. V.push_back(S[i]);
    13. }
    14. //转换为vector是方便删除元素,看个人喜好
    15. //去除ing后缀
    16. if(V[n-3]=='i'&&V[n-2]=='n'&&V[n-1]=='g')
    17. {
    18. for(int j=1;j<=3;j++)
    19. V.pop_back();
    20. goto shuchu;
    21. }
    22. //去除re后缀
    23. if(V[n-2]=='e'&&V[n-1]=='r')
    24. {
    25. for(int j=1;j<=2;j++)
    26. V.pop_back();
    27. goto shuchu;
    28. }
    29. //去除ly后缀
    30. if(V[n-2]=='l'&&V[n-1]=='y')
    31. {
    32. for(int j=1;j<=2;j++)
    33. V.pop_back();
    34. goto shuchu;
    35. }
    36. //删除一个后缀就要输出!因此采用goto语句
    37. shuchu:
    38. for(vector<char>::iterator it=V.begin();it!=V.end();it++)
    39. cout<<(*it);
    40. return 0;
    41. }

     

  • 相关阅读:
    操作系统学习笔记2 | 操作系统接口
    【vsCode + Arduino】在Visual Studio Code编译Arduino项目
    嵌入式分享合集109
    Windows证书过期【解决方法】
    Kafka安装使用
    VUE(一)
    2022河南萌新联赛第(七)场:南阳理工学院 G - 小明不希望太简单
    【Java】阿拉伯数字转汉字(完全符合中文阅读习惯)(支持所有整数类型)
    【Typescript重点】泛型的使用
    计算机毕业设计PySpark+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop
  • 原文地址:https://blog.csdn.net/jsl123x/article/details/134324824