查找学生信息(静态) && 动态查找问题

118 阅读1分钟

查找学生信息

输入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

思路

  1. 定义结构体和一个map容器。输入n和学生信息,将学号指向对应结构体。

  2. 输入查询的学号总数,和查询的学号,利用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

思路

  1. 定义map容器,存放数组中的数出现的次数。

  2. 输入数组中的数,再输入要查找的数x。

  3. 如果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级别的。