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

相关推荐
忆~遂愿6 分钟前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds16 分钟前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹17 分钟前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚18 分钟前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Ro Jace1 小时前
计算机专业基础教材
java·开发语言
mango_mangojuice1 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
程序员侠客行2 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
时艰.2 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
丶小鱼丶2 小时前
并发编程之【优雅地结束线程的执行】
java
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全