ALGO-10 集合运算

ALGO-10 集合运算

题目

资源限制

时间限制: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 中的余集中的所有元素。

样例输入 1

5
1 2 3 4 5
5
2 4 6 8 10

样例输出 1

2 4
1 2 3 4 5 6 8 10
1 3 5

样例输入 2

4
1 2 3 4
3
5 6 7

样例输出 2

1 2 3 4 5 6 7
1 2 3 4

题解

import java.util.Arrays;
import java.util.Scanner;

class Set {
    int[] arr;
    int size;

    public Set(int size) {
        this.size = size;
        this.arr = new int[size];
    }

    /**
     * @description: 并集
     * @param {Set} A
     * @param {Set} B
     * @return {Set} C = A+B
     */
    public static Set union(Set A, Set B) {
        Set C = new Set(A.size + B.size);
        int[] a = A.arr;
        int[] b = B.arr;
        int i = 0, j = 0, k = 0;
        while (i < A.size && j < B.size) {
            if (a[i] < b[j])
                C.arr[k++] = a[i++];
            else if (a[i] > b[j])
                C.arr[k++] = b[j++];
            else {
                C.arr[k++] = a[i++];
                j++;
            }
        }
        while (i < A.size) {
            C.arr[k++] = a[i++];
        }
        while (j < B.size) {
            C.arr[k++] = b[j++];
        }
        C.size = k;
        return C;
    }

    /**
     * @description: 差集
     * @param {Set} A
     * @param {Set} B
     * @return {Set} C = A-B
     */
    public static Set subtraction(Set A, Set B) {
        Set C = new Set(A.size);
        int[] a = A.arr;
        int[] b = B.arr;
        int i = 0, j = 0, k = 0;
        while (i < A.size && j < B.size) {
            if (a[i] < b[j])
                C.arr[k++] = a[i++];
            else if (a[i] > b[j])
                j++;
            else {
                i++;
                j++;
            }
        }
        while (i < A.size) {
            C.arr[k++] = a[i++];
        }
        C.size = k;
        return C;
    }

    /**
    * @description: 交集
    * @param {Set} A
    * @param {Set} B
    * @return {Set} C = AB
    */
    public static Set intersection(Set A, Set B) {
        Set C = new Set(Math.max(A.size, B.size));
        int[] a = A.arr;
        int[] b = B.arr;
        int i = 0, j = 0, k = 0;
        while (i < A.size && j < B.size) {
            if (a[i] < b[j])
                i++;
            else if (a[i] > b[j])
                j++;
            else {
                C.arr[k++] = a[i++];
                j++;
            }
        }
        C.size = k;
        return C;
    }

    @Override
    public String toString() {
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < size; i++) {
            str.append(this.arr[i] + " ");
        }
        return str.toString();
    }
}

public class ALGO_10 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Set A = new Set(n);
        for (int i = 0; i < n; i++) {
            A.arr[i] = scanner.nextInt();
        }
        int m = scanner.nextInt();
        Set B = new Set(m);
        for (int i = 0; i < m; i++) {
            B.arr[i] = scanner.nextInt();
        }
        scanner.close();
        Arrays.sort(A.arr);
        Arrays.sort(B.arr);
        System.out.println(Set.intersection(A, B));
        System.out.println(Set.union(A, B));
        System.out.println(Set.subtraction(A, B));
    }
}
posted @ 2022-03-18 13:41  morning-start  阅读(28)  评论(0编辑  收藏  举报