当前位置: 代码迷 >> 综合 >> SWUST OJ#1045 集合的交运算
  详细解决方案

SWUST OJ#1045 集合的交运算

热度:96   发布时间:2023-12-05 17:42:59.0

目录

题目

思路

代码

数据结构

STL


题目

假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。编程实现集合A和集合B的交运算。

输入

第一行为集合A的数据元素个数n;

第二行输入n个集合A的数据元素 ;

第三行为集合B的数据元素的个数;

第四行输入m个集合B的数据元素

输出

A和B的交集

样例输入

8
0 5 6 3 8 7 9 10
7
1 3 4 7 8 9 5

样例输出

5 3 8 7 9

思路

和SWUST OJ#1037集合的并运算有点类似

集合的并运算

由于集合是没有重复数据的,所以也是开一个桶,进行记忆化处理。

先遍历顺序表b,让b中所有的数,对应的桶赋值为1。然后再遍历顺序表a,若判断对应的桶也为1,则插入至顺序表c,桶变为0。完成求交集

最后输出顺序表c就行

注意:是先遍历b,因为最后输出是按照a的顺序来的。

//合并顺序表,求交集
void SeqlistMerge(Seqlist* &La,Seqlist* &Lb,Seqlist* &Lc) {int bucket[100005]={0};//开桶记忆化处理for(int i=0;i<Lb->len;i++) bucket[Lb->data[i]]=1;for(int i=0;i<La->len;i++) {//若桶为1,说明之前没有插入过该数据if(bucket[La->data[i]]==1) {Lc->data[Lc->len++]=La->data[i];bucket[La->data[i]]=0;//已经插入了,将桶赋值为0,以后就不再插入}}
}

代码

顺序表模板

数据结构

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
//定义顺序表
typedef struct {int data[10005];int len;
}Seqlist;
// 初始化顺序表
void SeqlistInit(Seqlist* &L) {L=(Seqlist*)malloc(sizeof(Seqlist));L->len=0;
}
//创建顺序表,输入数据
void SeqlistCreate(Seqlist* &L) {int n,x;cin>>n;while(n--) {cin>>x;L->data[L->len++]=x;}
}
//合并顺序表,求交集
void SeqlistMerge(Seqlist* &L1,Seqlist* &L2,Seqlist* &L3) {int bucket[100005]={0};for(int i=0;i<L2->len;i++) bucket[L2->data[i]]=1;for(int i=0;i<L1->len;i++) {if(bucket[L1->data[i]]) {L3->data[L3->len++]=L1->data[i];bucket[L1->data[i]]=0;}}
}
//打印顺序表,输出数据
void SeqlistPrint(Seqlist* &L) {for(int i=0;i<L->len-1;i++) {cout<<L->data[i]<<" ";}cout<<L->data[L->len-1]<<endl;
}
int main() {Seqlist *L1,*L2,*L3;SeqlistInit(L1);SeqlistCreate(L1);SeqlistInit(L2);SeqlistCreate(L2);SeqlistInit(L3);SeqlistMerge(L1,L2,L3);SeqlistPrint(L3);return 0;
}

STL

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int>a,b,c;
int bucket[100005];
int main() {int m,n,x;cin>>m;while(cin>>x,a.push_back(x),--m);cin>>n;while(cin>>x,bucket[x]=1,b.push_back(x),--n);vector<int>::iterator it;for(it=a.begin();it!=a.end();it++) {if(bucket[*it]) {c.push_back(*it);bucket[*it]=0;}}for(it=c.begin();it!=c.end();it++) {cout<<*it<<" ";}return 0;
}

  相关解决方案