-
题目
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
输入两个整数集合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
-
思路:用map记录每一个元素的出现次数,然后根据题目要求联合map中记录的元素次数输出
- 首先由于题目要求输出要按照小到大的顺序,故先对两个数组进行排序。
- 然后用LinkHashMap(这是一个顺序记录存入数据的map类)记录每个元素出现的次数,对A,B一次遍历,若A[j]>B[k]则将B存入并将k++,反之将A存入并将j++。最后将A、B其中一个数组未遍历完的元素全部一次存入map中。
- 交集:就是map中记录了元素(key)对应的value>1的。
- 并集:就是map中的所有key。
- 余集:遍历A,A中元素(key)在map中对应的value为1的输出。
-
代码:
package BlueBridge;
import java.util.*;
public class Aggregate {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] A = new int[n];
for (int i = 0; i < A.length; i++) {
A[i] = in.nextInt();
}
Arrays.sort(A);
int m = in.nextInt();
int[] B = new int[m];
for (int i = 0; i < B.length; i++) {
B[i] = in.nextInt();
}
Arrays.sort(B);
Map<Integer, Integer> map = new LinkedHashMap<>();
getABMap(map,A,B);
intersectionAgg(map,A,B);
UnionAgg(map,A,B);
CosetAgg(map,A,B);
}
private static void getABMap(Map<Integer, Integer> map, int[] a, int[] b) {
int j = 0, k = 0; //j负责a的遍历,k负责b的遍历
while (j < a.length && k < b.length) {
//将小的存入map在其对应数组中索引++,往前遍历
if (a[j] < b[k]) {
map.put(a[j], map.getOrDefault(a[j], 0) + 1);
j++;
} else {
map.put(b[k], map.getOrDefault(b[k], 0) + 1);
k++;
}
}
// 最后必有一个数组是由元素剩下还没有进入map的,将他们一次放入
while(j<a.length) {
map.put(a[j], map.getOrDefault(a[j], 0) + 1);
j++;
}
while (k<b.length){
map.put(b[k],map.getOrDefault(b[k],0)+1);
k++;
}
}
private static void CosetAgg(Map<Integer, Integer> map, int[] a, int[] b) { //求余集
for (int i = 0; i < a.length; i++) { //遍历数组a,其在map中映射值为1的肯定是余集
if (map.get(a[i])==1)
System.out.print(a[i]+" ");
}
System.out.println();
}
private static void intersectionAgg(Map<Integer, Integer> map, int[] a, int[] b) { //求交集
Set<Integer> set = map.keySet(); //将map中的key放入set中
for(Integer i:set){
if (map.get(i)>1) //将map中所有>1的key证明是AB中同时出现(交),输出
System.out.print(i+" ");
}
System.out.println();
}
private static void UnionAgg(Map<Integer, Integer> map, int[] b, int[] a) { //求并集
Set<Integer> set = map.keySet(); //将map中的key放入set中
for(Integer i:set) //将map中所有key输出
System.out.print(i+" ");
System.out.println();
}
}
-
补充:本题用到map中比较多的方法:
-
map.keySet():是将map中的key存入set对象中。
-
map. getOrDefault(k,v):是map中如果存在k,则返回映射的value,若不存在k,则设置其默认值为v。
-
(有错误欢迎指正哈,如果有不小心侵权的联系删除哈😁)