【华为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))。

最后按照题目要求输出排序后的结果即可。

题解

java 复制代码
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);
            }
        }
    }
}

推荐

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

相关推荐
Patrick在香港5 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术5 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫5 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话5 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠6 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
计算机小白一个6 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
sunburn-8 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发8 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh9 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java
计科土狗9 小时前
GESP六级专题之类与对象
java·前端·数据库