试题 算法训练 集合运算

问题描述
  给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
  第一行为一个整数n,表示集合A中的元素个数。
  第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
  第三行为一个整数m,表示集合B中的元素个数。
  第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
  集合中的所有元素均为int范围内的整数,n、m<=1000。
输出格式
  第一行按从小到大的顺序输出A、B交集中的所有元素。
  第二行按从小到大的顺序输出A、B并集中的所有元素。
  第三行按从小到大的顺序输出B在A中的余集中的所有元素。
样例输入
5
1 2 3 4 5
5
2 4 6 8 10
样例输出
2 4
1 2 3 4 5 6 8 10
1 3 5
样例输入
4
1 2 3 4
3
5 6 7
样例输出
1 2 3 4 5 6 7
1 2 3 4
 
方法一:利用STL中set有序性与查找函数实现
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <vector>
 
#define ci cin.tie(0)
#define ios ios::sync_with_stdio(false)
#define fi first
#define se second

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 1010;

int n, m, x;
set<int> a, b, unio;
vector<int> inter, resi;

int main()
{
    ci;ios;
     cin >> n;
     for (int i = 0; i < n; i ++ )
     {
         cin >> x;
         a.insert(x);
     }
     cin >> m;
     for (int i = 0; i < m; i ++ )
     {
         cin >> x;
         b.insert(x);
     }
     
     // 交集
    set<int>::iterator it;
    for (it = a.begin(); it != a.end(); it ++ )
    {
        if (b.find(*it) != b.end()) inter.push_back(*it);
    } 
    
    // 交集
    for (it = a.begin(); it != a.end(); it ++ )
        unio.insert(*it);
    for (it = b.begin(); it != b.end(); it ++ )
        unio.insert(*it);
        
    // 余集
    for (it = a.begin(); it != a.end(); it ++ )
    {
        if (b.find(*it) == b.end()) resi.push_back(*it);
    } 
    
    // 打印答案
    for (int i = 0; i < inter.size(); i ++ )
        cout << inter[i] << ' ';
    cout << endl;
    for (it = unio.begin(); it != unio.end(); it ++ )
        cout << *it << ' ';
    cout << endl;
    for (int i = 0; i < resi.size(); i ++ )
        cout << resi[i] << ' ';
    cout << endl;
    return 0;
}

方法二:利用自带函数求解

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <vector>
 
#define ci cin.tie(0)
#define ios ios::sync_with_stdio(false)
#define fi first
#define se second

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 1010;

int n, m, x;
vector<int> a, b, c;

void print(vector<int> &c)
{
    for (int i = 0; i < c.size(); i ++ )
        cout << c[i] << ' ';
    c.clear();
    cout << endl;
}

int main()
{
    ci;ios;
    cin >> n;
    for (int i = 0; i < n; i ++ )
    {
        cin >> x;
        a.push_back(x);
    }
    sort(a.begin(), a.end());
    cin >> m;
    for (int i = 0; i < m; i ++ )
    {
        cin >> x;
        b.push_back(x);
    }
    sort(b.begin(), b.end());
    set_intersection(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
    print(c);
    set_union(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
    print(c);
    set_difference(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
    print(c);
    return 0;
}

 转载自博客https://blog.csdn.net/qq_41979513/article/details/103191842

posted @ 2020-04-16 10:45  haust_zbx  阅读(309)  评论(0编辑  收藏  举报