蓝桥杯--P0705

  • 题目 

资源限制

内存限制: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。

(有错误欢迎指正哈,如果有不小心侵权的联系删除哈😁) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值