【蓝桥杯ALGO-10】集合运算 Java版

试题 算法训练 集合运算

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  给出两个整数集合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

Java 代码:

import java.io.*;

public class Main {

    private static int[] a;  // 集合 A
    private static int[] b;  // 集合 B
    private static int[] ab;  //交集
    private static int[] union;  // 并集

    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        // 输入集合 A
        int na = Integer.parseInt(in.readLine());
        a = new int[na];
        String[] sa = in.readLine().split(" ");
        for (int i = 0; i < na; i++) {
            a[i] = Integer.parseInt(sa[i]);
        }
        // 输入集合 B
        int nb = Integer.parseInt(in.readLine());
        b = new int[nb];
        String[] sb = in.readLine().split(" ");
        for (int i = 0; i < nb; i++) {
            b[i] = Integer.parseInt(sb[i]);
        }
        // 定义并集
        union = new int[na + nb];
        // 定义交集
        ab = new int[na + nb];
        // 计算交集
        int k = 0;
        for (int i = 0; i < na; i++) {
            union[i] = a[i]; // 将集合 A 中的元素放入并集
            for (int j = 0; j < nb; j++) {
                if (a[i] == b[j]) {
                    ab[k] = a[i];
                    k++;
                }
            }
        }
        // 计算并集
        int p = na;
        for (int i = 0; i < nb; i++) {
            boolean flag = false;
            for (int j = 0; j < na + nb; j++) {
                if (union[j] == b[i]) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                union[p] = b[i];
                p++;
            }
        }
        // 排序
        quickSort(ab, 0, k - 1);
        quickSort(union, 0, p - 1);
        // 输出交集
        for (int i = 0; i < k; i++) {
            System.out.print(ab[i] + " ");
        }
        System.out.println();
        // 输出并集
        for (int i = 0; i < p; i++) {
            System.out.print(union[i] + " ");
        }
        System.out.println();
        // 输出 B 在 A 中的余集
        quickSort(a, 0, na - 1);
        for (int i = 0; i < na; i++) {
            boolean f = false;
            for (int j = 0; j < k; j++) {
                if (a[i] == ab[j]) {
                    f = true;
                    break;
                }
            }
            if (!f) {
                System.out.print(a[i] + " ");
            }
        }
    }

    private static void quickSort(int[] a, int l, int r) {
        if (l > r)
            return;

        int pivot = a[r];
        int i = l;
        int temp;
        for (int j = i; j < r; j++) {
            if (a[j] < pivot) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
                i++;
            }
        }

        temp = a[i];
        a[i] = a[r];
        a[r] = temp;

        quickSort(a, l, i - 1);
        quickSort(a, i + 1, r);
    }
}
发布了34 篇原创文章 · 获赞 18 · 访问量 2923

猜你喜欢

转载自blog.csdn.net/weixin_40608613/article/details/104342296