试题 算法训练 集合运算
资源限制
时间限制: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);
}
}