[题目解析]找朋友
找朋友(friends)
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
小学毕业后,同学们都进入了不同的初中,小明非常想念小伙伴们,所以他打算联系小学的同学们。
现在他得到了市内某所初中的所有名单,找出其中小明的小伙伴们。
输入
第一行一个整数n,表示某初中人数。
接下来n行,每行一个字符串,只有小写字母组成,表示该校每个人的拼音。数据保证没有人拼音相同,且已经按照字典序从小到大排序。
第n+2行有一个整数m,表示小明的小伙伴个数。
最后m行,每行一个字符串,只有小写字母组成,表示每个小伙伴的拼音,同样保证没有重复。
输出
输出所有在该校的小伙伴的拼音。
每行一个拼音,顺序按照小伙伴给出的顺序。
样例输入
样例输入1:
3
alice
bob
zhangsan
2
lisi
zhangsan
样例输入2:
2
lisi
zhangsan
3
zhangsan
lisi
alice
样例输出
样例输出1:
zhangsan
样例输出2:
zhangsan
lisi
数据范围限制
对于70%的数据,n<=1000,m<=100
对于100%的数据,n<=100000,m<=10000,每个人拼音长度不超过15。
所有数据,学校学生名单中的姓名,都是按照字典序从小到大排序。
提示
样例1解释:
学校有3人,小伙伴有2个,zhangsan在这个学校,因此输出zhangsan
样例2解释:
学校有2人,小伙伴有3个,有zhangsan和lisi两人出现在名单中,小伙伴名单输入时lisi在zhangsan后面,所以在输出的小伙伴名单中,lisi排在后面。
这道题目我一开始做的时候确实是想复杂了,做复杂了。不多说,先看10分代码,详见注释↓↓↓
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct friends{//结构体
int sum;//看看出现了几次
char name[16];//名字
}a[100001],b[10001];
bool c[100001];
int s;
int main()
{
cin>>n;//输入,不废话了
for(int i=1;i<=n;i++){
cin>>a[i].name;
a[i].sum=0;
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i].name;
b[i].sum=0;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){//两层循环,找出有的名字
s=0;
for(int k=1;k<=strlen(b[i].name);k++){//两两匹配,看看是不是一样
if((int)(a[j].name[k])==(int)(b[i].name[k])){//如果当前字母相同,S++;
s++;
}
}
if(s==strlen(b[i].name)){//如果全部字母都一样, b[i].sum++;
b[i].sum++;
}
}
}
for(int i=1;i<=n;i++){
if(b[i].sum){//如果SUM加过,那就输出
puts(b[i].name);
cout<<endl;
}
}
}
接下来来看100分代码吧!(详见注释),这份代码十分简洁↓↓↓↓
#include<bits/stdc++.h>
using namespace std;
map<string,bool> mat;//使用map能更快捷完成本题
int main()
{
int n,m;
string a;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
mat[a]=true;//将mat[a]变成true,以便于后面判断
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>a;
if(mat[a])cout<<a<<endl;//输进来一个就看看之前有没有出现过,如果有就输出
}
}
//超级简洁,18行代码搞定(((o(*゚▽゚*)o)))
这篇文章有什么不足请在评论区留言哦!♪(^∀^●)ノ
вye вyЁ
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!