算法训练 集合运算

问题描述
  给出两个整数集合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
思路:首先三种情况我都是先导入数组,然后排序后输出,交集和余集都好说,两层循环遍历即可,并集想了很久,我先把两个数组都导入一个新的数组,然后排序,然后再输入,重复的不予输出,即 arr3[i] != arr3[i - 1] ,才会输出。
学习:用sort对vector数组排序时,实参是 v.begin(),v.end() ,相应代码即 sort(arr3.begin(), arr3.end(), cmp) , cmp 中若 return a < b; 是升序排列,反之是降序排列。
复制代码
  1 #include<iostream>
  2 #include<vector>
  3 #include<algorithm>
  4 using namespace std;
  5 
  6 bool cmp(int a, int b)
  7 {
  8     return a < b;
  9 }
 10 
 11 int main()
 12 {
 13     int arr1Num,arr2Num;
 14     int flag = 0;
 15     
 16     cin >> arr1Num;
 17     vector<int> arr1(arr1Num);
 18      for (int i = 0; i < arr1Num; i++)
 19     {
 20         cin >> arr1[i];
 21     }
 22 
 23     cin >> arr2Num;
 24     vector<int> arr2(arr2Num);
 25     for (int i = 0; i < arr2Num; i++)
 26     {
 27         cin >> arr2[i];
 28     }
 29 
 30     //交集
 31     int b[2000] = { 0 };
 32     int l = -1;
 33     for (int i = 0; i < arr1Num; i++)
 34     {
 35         for (int j = 0; j < arr2Num; j++)
 36         {
 37             if (arr1[i] == arr2[j])
 38             {
 39                 flag = 1;  //有交集
 40                 b[++l] = arr1[i];
 41             }
 42         }
 43     }
 44     if (flag == 1)  //有交集才输出换行
 45     {
 46         sort(b, b + l + 1, cmp);
 47         for (int i = 0; i < l + 1; i++)
 48         {
 49             cout << b[i] << " ";
 50         }
 51         cout << endl;
 52     }
 53     
 54     //并集
 55     vector<int> arr3(arr1Num+arr2Num);
 56     for (int i = 0; i < arr1Num; i++) //把两个数组的数字全导入arr3中
 57     {
 58         arr3[i] = arr1[i];
 59     }
 60     for (int j = arr1Num; j < arr1Num + arr2Num; j++)
 61     {
 62         arr3[j] = arr2[j - arr1Num];
 63     }
 64     sort(arr3.begin(), arr3.end(), cmp); //从小到大排序
 65     cout << arr3[0] << " ";
 66     for (int i = 1; i < arr1Num + arr2Num; i++)
 67     {
 68         if (arr3[i] != arr3[i - 1])
 69         {
 70             cout << arr3[i] << " ";
 71         }
 72     }
 73     cout << endl;
 74 
 75     //余集
 76     int i, j,k = -1;
 77     int a[2000] = { 0 };  //先记录下来
 78     int cnt = 0;
 79     for (i = 0; i < arr1Num; i++)
 80     {
 81         for (j = 0; j < arr2Num; j++)
 82         {
 83             if (arr1[i] == arr2[j])
 84             {
 85                 break;
 86             }
 87         }
 88         if (j == arr2Num)
 89         {
 90             a[++k] = arr1[i];
 91             cnt++;
 92         }
 93     }
 94     sort(a, a + k + 1, cmp); //从小到大输出
 95     for (i = 0; i < cnt; i++)
 96     {
 97         cout << a[i] << " ";
 98     }
 99     return 0;
100 }
复制代码

 

posted @   Xxaj5  阅读(299)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示