• 【华为OD题库-025】 找出两个整数数组中同时出现的整数-java


    题目

    现有两个整数数组,需要你找出两个数组中同时出现的整数,并按照如下要求输出:
    1.有同时出现的整教时,先按照同时出现次数(整数在两个数组中都出现并目出现次数较少的那个)进行归类,然后按照出现次数从小到大依次按行输出。
    2.没有同时出现的整数时,输出NULL
    输入描述
    第一行为第一个整数数组,第二行为第二个整数数组,每行数中整数与整数之间以英文号分,数组长度的范围为[1,10000]之间的整数。
    输出描述
    按照出现次数从小到大依次按行输出,每行输出的格式为:
    出现次数:该出现次数下的整数升序排序的结果
    格式中的":"为英文冒号,整数间以英文逗号分隔
    示例1:
    输入
    5,3,6,-8,0,11
    2,8,8,8,-1,15
    输出
    NULL
    说明
    两个整数数组没有同时出现的整数,输出NULL。
    示例2:
    输入:
    5,8,11,3,6,8,8,-1,11,2,11,11
    11,2,11,8,6,8,8,-1,8,15,3,-9,11
    输出
    1:-1,2,3,6
    3:8,11
    说明
    两整数数组中同时出现的整数为-12、3、 6、8、 11 ,其中同时出现次数为1的整数为-1,2,36(升序排序),同时出现次数为3的整数为8,11(升序排序),先升序输出出现次数为1的整数,再升序输出出现次数为3的整数。

    思路

    简单题,使用两个map分别统计两个数组出现的次数,再在两个map中找到公共的交集(key值相同的),对于指定key来说,公共出现次数等于min(map1.get(key),map2.get(key))。
    最后按照题目要求输出排序后的结果即可。

    题解

    package hwod;
    
    import java.util.*;
    
    public class FindSameNumInArr {
        private static Map<Integer, List<Integer>> resMap;
        private static Map<Integer, Integer> map1;
        private static Map<Integer, Integer> map2;
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int[] arrs1 = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
            int[] arrs2 = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
            map1 = new HashMap<>();
            map2 = new HashMap<>();
            for (int i = 0; i < arrs1.length; i++) {
                map1.put(arrs1[i], map1.getOrDefault(arrs1[i], 0) + 1);
            }
            for (int i = 0; i < arrs2.length; i++) {
                map2.put(arrs2[i], map2.getOrDefault(arrs2[i], 0) + 1);
            }
            resMap = new HashMap<>();
            findSameNumInArr();
            if (resMap.size() == 0) {
                System.out.println("NULL");
            } else {
                ArrayList<Integer> list = new ArrayList<>(resMap.keySet());
                list.sort(Comparator.comparingInt(o -> o));
                for (int i = 0; i < list.size(); i++) {
                    int cnt = list.get(i);
                    System.out.print(cnt + ":");
                    List<Integer> rows = resMap.get(cnt);
                    rows.sort(Comparator.comparingInt(o -> o));
                    for (int j = 0; j < rows.size(); j++) {
                        if (j != 0) System.out.print(",");
                        System.out.print(rows.get(j));
                    }
                    System.out.println();
    
                }
            }
    
    
        }
    
        private static void findSameNumInArr() {
            Set<Integer> set1 = map1.keySet();
            for (Integer item : set1) {
                if (map2.containsKey(item)) {
                    int cnt = Math.min(map1.get(item), map2.get(item));
                    List<Integer> tlist = resMap.getOrDefault(cnt, new ArrayList<>());
                    tlist.add(item);
                    resMap.put(cnt, tlist);
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    推荐

    如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

  • 相关阅读:
    SQLite利用事务实现批量插入(提升效率)
    大一学生Web课程设计 美食主题网页制作(HTML+CSS+JavaScript)
    【LCR 159. 库存管理 III】
    [附源码]Python计算机毕业设计二手图书回收销售网站
    考察1学生学籍系统winform .net6 sqlserver
    2024年高新技术企业认定标准
    Speedoffice有几种版本?适合什么系统使用呢?
    最新!基于Open3D的点云处理入门与实战教程
    MySQL中的InnoDB引擎
    使用OpenTelemetry进行监控
  • 原文地址:https://blog.csdn.net/qq_31076523/article/details/134460671