• 算法训练 集合运算


    问题描述
      给出两个整数集合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 }
  • 相关阅读:
    Linux08:帮助与常用快捷键
    Android : 跟我学Binder --- (5) C++实现
    Linux应用调试 :使用gdb和gdbserver进行远程调试
    Mosquitto-1.5在Linux上的安装以及Android客户端的实现
    MySQL-8.0.15在Win10和Ubuntu上安装&使用
    Android : 跟我学Binder --- (4) 驱动情景分析
    Android : Android Studio 更新至gradle 4.10.1后Variants API变化
    Android : 跟我学Binder --- (3) C程序示例
    Android : 关于HTTPS、TLS/SSL认证以及客户端证书导入方法
    Android : 跟我学Binder --- (2) AIDL分析及手动实现
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12715015.html
Copyright © 2020-2023  润新知