计蒜客详解合集(1)期

编程入门 行业动态 更新时间:2024-10-23 16:15:52

计蒜客详解<a href=https://www.elefans.com/category/jswz/34/1769982.html style=合集(1)期"/>

计蒜客详解合集(1)期

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

目录

T1266——出勤记录

T1170——人民币支付 

T1122——最长最短单词 

T1115——字符串判等

T1116——验证子串 

T1118——删除单词后缀 


T1266——出勤记录

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

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

int late=-1; //连续缺勤的次数 int max=0;//最长连续的L //缺勤检验 for(int k=0;k<=temp.size()-1;k++){if(temp[k]=='L'&&late==-1){late=1;//当前是连续的第一个迟到记录 }else if(temp[k]=='L'&&late!=-1) {//不为-1意味着当前不是第一个连续的迟到记录,所以直接加一就好late++; }else if(temp[k]!='L'){//如果不为k,则直接清零重新计数if(late>max)max=late;late=-1; }}L.push_back(max);

全文代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;int main(int argc, char** argv) {int num=0;cin>>num;vector<int> V;vector<int> L;for(int i=1;i<=num;i++){string temp;cin>>temp;int count=0;// 缺勤次数 //缺勤检验for(int j=0;j<=temp.size()-1;j++){if(temp[j]=='A')count++; 		}V.push_back(count);int late=-1; //连续缺勤的次数 int max=0;//最长连续的L //缺勤检验 for(int k=0;k<=temp.size()-1;k++){if(temp[k]=='L'&&late==-1){late=1;//当前是连续的第一个迟到记录 }else if(temp[k]=='L'&&late!=-1) {//不为-1意味着当前不是第一个连续的迟到记录,所以直接加一就好late++; }else if(temp[k]!='L'){//如果不为k,则直接清零重新计数if(late>max)max=late;late=-1; }}L.push_back(max);}for(int i=0;i<=num-1;i++){if(V[i]<=1&&L[i]<3)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;
}

T1170——人民币支付 

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

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

#include <iostream>
using namespace std;int main(int argc, char** argv) {int num=0;cin>>num;int money[6]={100,50,20,10,5,1};for(int i=0;i<=5;i++){int count=0;count=num/money[i];num-=money[i]*count;cout<<count<<endl;}return 0;
}

T1122——最长最短单词 

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

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

#include <iostream>
#include <string>
#include <vector>
using namespace std;int main(int argc, char** argv) {string S;vector<string> V;getline(cin,S);string temp;//分割单词 for(int i=0;i<=S.size()-1;i++){temp+=S[i];if(S[i]==' '||i==S.size()-1)//最后一个单词要有单独的操作 {V.push_back(temp);temp.clear();}	}//删除除了最后一个单词以外,末尾的空格 for(int i=0;i<V.size()-1;i++){string temp=V[i];temp.erase(temp.size()-1);V[i]=temp;}//	cout<<endl;
//	for(int i=0;i<=V.size()-1;i++)
//	{
//		cout<<V[i].size()<<endl;
//	}
// 检验单词长度 
//	cout<<endl;int max=V[0].size(),maxt=0;int min=V[0].size(),mint=0;//两类辅助变量 for(int i=0;i<=V.size()-1;i++){//判断是否大于当前if(V[i].size()>max){max=V[i].size();maxt=i;	} //判断是否小于当前 if(V[i].size()<min){min=V[i].size();mint=i;	}}cout<<V[maxt]<<endl;cout<<V[mint]<<endl;return 0;
}

T1115——字符串判等

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

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

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

	string s1,s2;getline(cin,s1);getline(cin,s2);

剔除字符串中的空格

string DeBlack(string s)
{string n;for(int i=0;i<=s.size()-1;i++)if(s[i]!=' ')n+=s[i];return n;
}

统一字符为大写

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

判断字符串是否相等

int DoQua(string s1,string s2)
{if(s1.size()!=s2.size())return -1;for(int i=0;i<=s1.size()-1;i++){if(s1[i]!=s2[i])return -1;}return 1;
}

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

#include <iostream>
#include <string>#include <vector> 
using namespace std;string DeBlack(string s)
{string n;for(int i=0;i<=s.size()-1;i++)if(s[i]!=' ')n+=s[i];return n;
}string ConDX(string s)
{for(int i=0;i<=s.size()-1;i++)if(s[i]>=97&&s[i]<=122)s[i]=s[i]-32;return s;
}
int DoQua(string s1,string s2)
{if(s1.size()!=s2.size())return -1;for(int i=0;i<=s1.size()-1;i++){if(s1[i]!=s2[i])return -1;}return 1;
}int main(int argc, char** argv) 
{string s1,s2;getline(cin,s1);getline(cin,s2);string n1=DeBlack(s1);n1=ConDX(n1);string n2=DeBlack(s2);n2=ConDX(n2);//	cout<<n1<<" & "<<n2<<endl;int ans=DoQua(n1,n2);if(ans==1)cout<<"YES"<<endl;elsecout<<"NO"<<endl;return 0;
}

 

T1116——验证子串 

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

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

子串裁剪

string Sfind(string s,int pos,int len)
{string temp;for(int i=pos;i<len+pos;i++){temp+=s[i];}return temp;
}

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

子串比较

int Scmp(string sa,string sb)
{int ans=0;for(int i=0;i<=sa.length()-1;i++){if(sa[i]!=sb[i]){ans=sa[i]-sb[i];return ans;}}ans=sa.length()-sb.length();return ans;
}

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

完整代码如下:

#include <iostream>
#include <vector>
#include <string>
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
string Sfind(string s,int pos,int len)
{string temp;for(int i=pos;i<len+pos;i++){temp+=s[i];}return temp;
}
int Scmp(string sa,string sb)
{int ans=0;for(int i=0;i<=sa.length()-1;i++){if(sa[i]!=sb[i]){ans=sa[i]-sb[i];return ans;}}ans=sa.length()-sb.length();return ans;
}
int main(int argc, char** argv) 
{string s1,s2;cin>>s1;cin>>s2;if(s1.length()>=s2.length()){int f1=0;for(int i=0;i<=s1.size()-1;i++){string temp=Sfind(s1,i,s2.length());if(Scmp(s2,temp)==0){cout<<s2<<" is substring of "<<s1<<endl;f1=1;break;}}if(f1==0)cout<<"No substring"<<endl;}else if(s1.length()<s2.length()){int f1=0;for(int i=0;i<=s2.size()-1;i++){string temp=Sfind(s2,i,s1.length());if(Scmp(s1,temp)==0){cout<<s1<<" is substring of "<<s2<<endl;f1=1;break;}		 	 		}if(f1==0)cout<<"No substring"<<endl;} return 0;
}


T1118——删除单词后缀 

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

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

#include <iostream>
#include <vector>
#include <string>
using namespace std;int main(int argc, char** argv) {string S;cin>>S;int n=S.length();vector<char> V;for(int i=0;i<=n-1;i++){V.push_back(S[i]);}//转换为vector是方便删除元素,看个人喜好 //去除ing后缀if(V[n-3]=='i'&&V[n-2]=='n'&&V[n-1]=='g'){for(int j=1;j<=3;j++)V.pop_back();	goto shuchu;} //去除re后缀if(V[n-2]=='e'&&V[n-1]=='r'){for(int j=1;j<=2;j++)V.pop_back();goto shuchu;}  //去除ly后缀if(V[n-2]=='l'&&V[n-1]=='y'){for(int j=1;j<=2;j++)V.pop_back();goto shuchu;}  //删除一个后缀就要输出!因此采用goto语句 shuchu:for(vector<char>::iterator it=V.begin();it!=V.end();it++)cout<<(*it);return 0;
}

 

更多推荐

计蒜客详解合集(1)期

本文发布于:2023-11-15 15:13:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1601782.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:合集   详解   计蒜客

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!