【华为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),查看当前专栏更新的所有题目。

相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415911 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风14 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112315 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员15 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus