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

相关推荐
专注于大数据技术栈几秒前
Java中JDK、JRE、JVM概念
java·开发语言·jvm
YuanlongWang4 分钟前
C# 基础——值类型与引用类型的本质区别
java·jvm·c#
Kay_Liang28 分钟前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
自由的疯1 小时前
Java 如何学习Docker
java·后端·架构
自由的疯1 小时前
Java Docker本地部署
java·后端·架构
007php0071 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存
一勺菠萝丶1 小时前
在 macOS 上用 Docker 为 Java 后端 & 常见开发需求搭建完整服务(详尽教程)
java·macos·docker
顾漂亮1 小时前
JVM底层攻坚
java·jvm·spring
编程岁月1 小时前
java面试-0215-HashMap有序吗?Comparable和Comparator区别?集合如何排序?
java·数据结构·面试