查找学生信息
输入N 个学生的信息,然后进行查询。
输入描述
输入的第一行为N,即学生的个数(N<=1000)接下来的N 行包括N 个学生的信息,信息格式如下:
- 01 李江男21
- 02 刘唐男23
- 03 张军男19
- 04 王娜女19
然后输入一个M(M<=10000),接下来会有M 行,代表M 次查询,每行输入一个学号,格式如下:
- 02
- 03
- 01
- 04
输出描述
输出M 行,每行包括一个对应于查询的学生的信息。 如果没有对应的学生信息,则输出“No Answer!”
示例
输入
4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
03
01
04
03
输出
02 刘唐 男 23
03 张军 男 19
01 李江 男 21
04 王娜 女 19
03 张军 男 19
思路
-
定义结构体和一个map容器。输入n和学生信息,将学号指向对应结构体。
-
输入查询的学号总数,和查询的学号,利用if判断,容器m调用find(num)方法,是否查到了末尾,如果找到对应学号,则输出对应信息。如果到末尾了,还未找到对应学号,则输出 "No Answer!" 。
具体实现
#include<bits/stdc++.h>
using namespace std;
struct node{
string num; //学号
string name;
string sex;
int age;
};
int main(){
int n,q;
map<string,node> m; //定义一个map映射
while(cin>>n){
for(int i=0; i<n; i++){
struct node tmp;
cin>>tmp.num>>tmp.name>>tmp.sex>>tmp.age;
m[tmp.num] = tmp; //将学号指向对应的结构体
}
scanf("%d",&q);
for(int i=0; i<q; i++){
string num;
cin>>num;
if(m.find(num) != m.end()) //find查找,如果找不到则返回末尾
cout<<m[num].num<<" "<<m[num].name<<" "<<m[num].sex<<" "<<m[num].age<<endl;
else
cout<<"No Answer!";
}
}
return 0;
}
动态查找问题
有n个整数的集合,想让你从中找出x 是否存在。
输入描述
-
第一行输入一个正整数n(n < 100000)
-
第二行输入n 个正整数,用空格隔开。
-
第三行输入一个正整数q(q<100000),表示查询次数。
-
接下来输入q 行,每行一个正整数x,查询x 是否存在。
输出描述
如果x存在,请输出find,如果不存在,请输出no,并将x加入到集合中。
示例
输入
5
1 2 3 4 5
3
6
6
3
输出
no
find
find
思路
-
定义map容器,存放数组中的数出现的次数。
-
输入数组中的数,再输入要查找的数x。
-
如果x在数组中的个数为0,表示集合中无此数,输出"no",并把此数的个数添加至map集合中。若x在容器中的个数不为0,则输出"yes" 。
具体实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,q,x;
map<int, int> m; //定义一个map映射
cin>>n;
for(int i=0; i<n; i++){
cin>>x;
m[x]++; //记录集合中x有多少个
}
cin>>q;
for(int i=0; i<q; i++){
cin>>x;
if(m[x] == 0){ //如果x的个数为0
cout<<"no"<<endl;
m[x]++; //将x加入到集合中
}
else
cout<<"find"<<endl;
}
return 0;
}
小结
-
当数据量特别大或查询次数特别多时,推荐用map容器,而不是sort。
-
map,是STL的一种关联式容器,它的底层是红黑树实现的,也就意味着它的插入和查找操作都是log级别的。