【c/c++编程】查找类问题

目录

查找学生信息

动态查找问题

查找学生信息

查找1

查找 - 北邮

查找第K小数


查找学生信息

  •  题目描述

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

  • 输入样例#:

 01 李江 男 21

02 刘唐 男 23

03 张军 男 19

04 王娜 女 19 

02

03

01

04

  • 输出样例#:

02 刘唐 男 23

03 张军 男 19

01 李江 男 21

04 王娜 女 19

03 张军 男 19

使用 map 来解决这类问题 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

struct node{
	string num;
	string name;
	string sex;
	int age;
	};

int main(){
	int n,q;
	map<string ,node> M;//定义一个map映射,索引num(string类型)->结构体
	while(scanf("%d",&n) != EOF){
		for(int i = 0;i<n;i++){
			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())
				cout<<M[num].num<<" "<<M[num].name<<" "<<M[num].sex<<" "<<M[num].age<<endl;
			else
				cout<<"No Answer!"<<endl;
		} 
	}
	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
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

int main(){
	int n,q,x;
	map<int,int>M;//数字 —>出现次数 
	while(cin>>n){//输入正整数n 
		for(int i = 0;i<n;i++){
			cin>>x;//输入n个正整数 
			M[x]++;
		}
		cin>>q;//输入查询次数q 
		for(int i = 0;i<q;i++){
			cin>>x;
			if (M[x] ==0){///如果 x的次数为0 
				cout<<"no\n"<<endl;
				M[x]++;;//将 x 加入到集合中
			}
			else cout<<"find\n"<<endl;
		}
	}
		return 0;
}

查找学生信息

题目描述

“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。     首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。

输入描述:

多组测试数据。
每个案例第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)

输出描述:

每个案例包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)

输入样例#:

4 5
2
3
2
1

输出样例#:

1
BeiJu
1
BeiJu
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

int main(){
	int n,m;
	while(cin>>n>>m){
		map<int,int> M;//最喜欢的图书编号->图书出现次数
		int a[n];//读者最喜欢的图书 
		for(int i = 0;i<n;i++){
			cin>>a[i];//输入读者i阅读的书 
			M[a[i]]++;
			}// 阅读的书相同的时候,图书+1 
		for(int i = 0;i<n;i++){
			if(M[a[i]]>=2) 
				cout<<(M[a[i]] - 1)<<endl;//除去自身阅读的一本以外 
			else 
				cout<<"Beiju"<<endl;
		}
	}
		return 0;
}

查找1

题目描述

输入数组长度 n 
输入数组      a[1...n] 
输入查找个数m 
输入查找数字b[1...m] 
输出 YES or NO  查找有则YES 否则NO 。

输入描述:

输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100)。

输出描述:

如果在n个数组中输出YES否则输出NO。

输入样例#:

6
3 2 5 4 7 8
2
3 6

输出样例#:

YES
NO
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

int main(){
	int n,m,x;
	int a[n];
	map<int,int>M;//map映射 
	cin>>n;//输入n 
	for(int i = 0;i<n;i++){
		cin>>a[i];//输入n个整数 
		M[a[i]]++;//数i出现的次数 
			}
	cin>>m;//输入查找的数字个数m 
	while(m--){
		cin>>x; //输入要查找的m个数字 
		if(M.find(x)!= M.end()) //用find这个函数,去找M这个映射中的x,如果映射中的x存在,就不会返回end()。
			cout<<"YES"<<endl;
		else
			cout<<"No"<<endl;
		
	}}

查找 - 北邮

题目描述

    读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1、翻转  从下标为i的字符开始到i+len-1之间的字符串倒序;2、替换  命中如果第一位为1,用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串。每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上)。     命令格式:第一位0代表翻转,1代表替换;第二位代表待操作的字符串的起始下标int i;第三位表示需要操作的字符串长度int len。

输入输出格式

输入有多组数据。
每组输入一个字符串(不大于100)然后输入n,再输入n条指令(指令一定有效)。

输出描述:

根据指令对字符串操作后输出结果。

输入样例

bac
2
003
112as

输出样例

cab
cas
#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    int n;
    cin>>s>>n;
    for(int i=0;i<n;i++)
    {	string cmd;//命令 
        cin>>cmd;
        int Begin = cmd[1] - '0';//命令第二位代表起始下标 
        int len = cmd[2] - '0';//命令第三位代表字符串长度 
        if(cmd[0] == '0')
        {//翻转 
            reverse(s.begin()+Begin,s.begin()+Begin+len);
        }
        else
        {//替换 
        //从命令字符串cmd下标为3处获得长度为 cmd.size()-3的字符串 
            string purpose = cmd.substr(3,cmd.size()-3);
            s.replace(Begin,Begin+len-1,purpose);
        }
        cout<<s<<endl;
    }
 
    return 0;
}

查找

查找第K小数

题目描述

查找一个数组的第K小的数,注意同样大小算一样大。 如  2 1 3 4 5 2 第三小数为3。

输入描述:

输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000),再输入k。

输出描述:

输出第k小的整数。

输入样例

6
2 1 3 5 2 2
3

输出样例

3
#include <bits/stdc++.h>
using namespace std;

int main()
{
   int n,a[n],k;
   while(cin>>n){
   	for(int i;i<n;i++)
   		cin>>a[i];
	set<int> s;
   	   	
   	for(int i = 0;i<n;i++)
   		s.insert(a[i]);
   		
   	cin>>k;
   	auto p = s.begin();
   	while(--k) p++;
   	cout<<*p;

   }
 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值