SWUST OJ#1045 集合的交运算

本文介绍了一种使用线性表和桶记忆化处理实现集合交集的方法,适用于两个已知集合的交运算。首先遍历集合B填充记忆化桶,然后遍历集合A,检查桶中对应元素是否为1,若是则插入交集结果。同时提供了STL版本的解决方案,利用vector容器简化代码。这种方法注重输出顺序,并确保无重复元素。
摘要由CSDN通过智能技术生成

目录

题目

思路

代码

数据结构

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衿白首志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值