题目描述:
已知 A 和 B 均是由整型数据组成的集合,使用顺序表表示集合,设计算法求集合A、B 的交集和并集,功能包括输入集合A,输入集合B,求A和B的并集,求A和B的交集。本题中, 线性表的第一个元素位置为1,线性表的最大长度为20。
输入描述:
各个命令以及相关数据的输入格式如下:
输入集合A:输入A,接下来的一行是要输入的集合元素个数 n ,下面是 n 行数据,每行数据有一个值,代表集合元素值 ;
输入集合B:B,接下来的一行是要输入的集合元素个数 n,下面是 n 行数据,每行数据有一个值;
当输入的命令为 U 时,输出 A 和 B 两个集合的并集;
当输入的命令为 I 时,输出 A 和 B 两个集合的交集;
当输入的命令为 E 时,程序结束。注意,所有的元素均占一行。
输出描述:
当输入的命令为 U 时,输出 A 和 B 两个集合的并集(元素从小到大排序输出) 当输入的命令为 I 时,输出 A 和 B 两个集合的交集(从小到大排序输出)。
注意,所有的元素均占一行!!!
代码示例:
Java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);ArrayList<Integer> a = new ArrayList<>(); // 用于存储集合 AArrayList<Integer> b = new ArrayList<>(); // 用于存储集合 BArrayList<Integer> c = new ArrayList<>(); // 用于存储交集ArrayList<Integer> d = new ArrayList<>(); // 用于存储并集while (true) {char sel = scanner.next().charAt(0); // 读取用户选择的操作if (sel == 'A') { // 输入集合 Aint la = scanner.nextInt(); // 读取集合 A 的大小a.clear(); // 清空集合 A 以便重新输入for (int i = 0; i < la; i++) {a.add(scanner.nextInt()); // 读取集合 A 的元素}// 使用传统的 Comparator 对集合 A 进行排序a.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer x, Integer y) {return x.compareTo(y); // 按自然顺序升序排序}});}if (sel == 'B') { // 输入集合 Bint lb = scanner.nextInt(); // 读取集合 B 的大小b.clear(); // 清空集合 B 以便重新输入for (int i = 0; i < lb; i++) {b.add(scanner.nextInt()); // 读取集合 B 的元素}// 使用传统的 Comparator 对集合 B 进行排序b.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer x, Integer y) {return x.compareTo(y); // 按自然顺序升序排序}});}if (sel == 'U') { // 计算集合 A 和 B 的并集d.clear(); // 清空并集集合int i = 0, j = 0;// 使用双指针法合并两个有序集合 A 和 Bwhile (i < a.size() && j < b.size()) {if (a.get(i) < b.get(j)) {d.add(a.get(i++)); // 如果 A[i] 小于 B[j],加入 A[i]} else if (a.get(i) > b.get(j)) {d.add(b.get(j++)); // 如果 A[i] 大于 B[j],加入 B[j]} else {d.add(a.get(i++)); // 如果 A[i] 等于 B[j],加入其中一个并递增 i 和 jj++;}}// 将剩余的元素加入并集集合 dwhile (i < a.size()) d.add(a.get(i++));while (j < b.size()) d.add(b.get(j++));// 打印并集结果System.out.println("并集: " + Arrays.toString(d.toArray()));}if (sel == 'I') { // 计算集合 A 和 B 的交集c.clear(); // 清空交集集合int i = 0, j = 0;// 查找两个有序集合 A 和 B 的交集while (i < a.size() && j < b.size()) {if (a.get(i) < b.get(j)) {i++; // 如果 A[i] 小于 B[j],递增 i} else if (a.get(i) > b.get(j)) {j++; // 如果 A[i] 大于 B[j],递增 j} else {c.add(a.get(i++)); // 如果 A[i] 等于 B[j],加入交集并递增 i 和 jj++;}}// 打印交集结果System.out.println("交集: " + Arrays.toString(c.toArray()));}if (sel == 'E') { // 如果输入 'E',退出程序break;}}scanner.close(); // 关闭扫描器}
}
C
#include<stdio.h> int main() {int a[20], b[20], c[20], d[40]; // 定义数组 a 和 b 用于存储集合,c 用于存储交集,d 用于存储并集int la = 0, lb = 0, lc = 0, ld = 0; // 定义各集合的长度变量char sel; // 用于选择操作的字符变量while (1) {scanf(" %c", &sel); // 读取用户选择的操作if (sel == 'A') { // 输入集合 Ascanf("%d", &la); // 读取集合 A 的大小for (int i = 0; i < la; i++) {scanf("%d", &a[i]); // 读取集合 A 的元素}// 对集合 A 进行冒泡排序,确保元素按升序排列for (int i = 0; i < la - 1; i++) {for (int j = i + 1; j < la; j++) {if (a[i] > a[j]) {int temp = a[i];a[i] = a[j];a[j] = temp;}}}}if (sel == 'B') { // 输入集合 Bscanf("%d", &lb); // 读取集合 B 的大小for (int i = 0; i < lb; i++) {scanf("%d", &b[i]); // 读取集合 B 的元素}// 对集合 B 进行冒泡排序,确保元素按升序排列for (int i = 0; i < lb - 1; i++) {for (int j = i + 1; j < lb; j++) {if (b[i] > b[j]) {int temp = b[i];b[i] = b[j];b[j] = temp;}}}}if (sel == 'U') { // 计算集合 A 和 B 的并集int i = 0, j = 0;// 合并两个有序数组 a 和 b 到数组 d 中while (i < la && j < lb) {if (a[i] < b[j]) {d[ld++] = a[i++]; // 如果 a[i] 小于 b[j],将 a[i] 加入并集并递增 i} else if (a[i] > b[j]) {d[ld++] = b[j++]; // 如果 a[i] 大于 b[j],将 b[j] 加入并集并递增 j} else {d[ld++] = a[i++]; // 如果 a[i] 等于 b[j],加入其中一个元素并递增 i 和 jj++;}}// 将剩余的元素加入并集数组 dwhile (i < la) d[ld++] = a[i++];while (j < lb) d[ld++] = b[j++];// 打印并集结果printf("并集: ");for (int k = 0; k < ld; k++) {printf("%d ", d[k]);}printf("\n");}if (sel == 'I') { // 计算集合 A 和 B 的交集int i = 0, j = 0;// 查找两个有序数组 a 和 b 的交集while (i < la && j < lb) {if (a[i] < b[j]) {i++; // 如果 a[i] 小于 b[j],递增 i} else if (a[i] > b[j]) {j++; // 如果 a[i] 大于 b[j],递增 j} else {c[lc++] = a[i++]; // 如果 a[i] 等于 b[j],将该元素加入交集并递增 i 和 jj++;}}// 打印交集结果printf("交集: ");for (int k = 0; k < lc; k++) {printf("%d ", c[k]);}printf("\n");}if (sel == 'E') { // 如果输入 'E',退出程序return 0;}}
}
Java小知识:scanner.next()
返回的是一个字符串,如果只输入了一个字符,这个字符串长度为 1,然后用 charAt(0)
来取得这个字符串的第一个字符。