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

相关推荐
Otaku love travel11 分钟前
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
java·tomcat·初始化·动态数据源
DKPT24 分钟前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star39 分钟前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
晨岳1 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
执笔诉情殇〆1 小时前
前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
java·服务器·redis·nginx·minio
YuTaoShao1 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表
程序员的世界你不懂1 小时前
(20)Java+Playwright自动化测试- 操作鼠标拖拽 - 上篇
java·python·计算机外设
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai
不像程序员的程序媛2 小时前
redis的一些疑问
java·redis·mybatis
知其然亦知其所以然3 小时前
Java 面试高频题:GC 到底回收了什么、怎么回收、啥时候回收?
java·后端·面试