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));
}
}