华为OD机试真题 Java 实现【数组去重和排序】【2023 B卷 100分】-LMLPHP

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。

二、输入描述

一个数组。

三、输出描述

去重排序后的数组。

四、解题思路

整体的解题思路:

  1. 输入一个数组,通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
  2. 定义一个map,存储每个数字出现的次数,key是数字,value是数字出现的次数;
  3. 根据题意要用到数组中数字出现的顺序,故使用 LinkedHashMap 来实现插入顺序和遍历顺序一致的 HashMap;
  4. 单独定义一个函数,根据map的值value进行降序排序;
    • 利用Map的entrySet方法,转化为list进行排序;
    • 利用Collections的sort方法对list排序;
    • 遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储;
    • 返回linkedHashMap;
  5. 遍历排序好的linkedHashMap,输出去重排序后的数组;

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 给定一个乱序的数组
        int[] input = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();

        /**
         * 使用 LinkedHashMap 来实现插入顺序和遍历顺序一致的 HashMap
         *
         * key:数字
         * value:数字出现的次数
         */
        Map<Integer, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < input.length; i++) {
            if (map.containsKey(input[i])) {
                map.put(input[i], map.get(input[i]) + 1);
            } else {
                map.put(input[i], 1);
            }
        }

        StringBuilder builder = new StringBuilder();
        // 根据map的值value进行降序排序
        Map<Integer, Integer> sortMap = getSortMap(map);
        for(Map.Entry<Integer,Integer> entry : sortMap.entrySet()){
            builder.append(entry.getKey()+",");
        }
        System.out.println(builder.substring(0,builder.length()-1));
    }

    /**
     * 根据map的值value进行降序排序
     */
    public static Map<Integer, Integer> getSortMap(Map<Integer, Integer> map) {
        // 利用Map的entrySet方法,转化为list进行排序
        List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(map.entrySet());
        // 利用Collections的sort方法对list排序
        Collections.sort(entryList, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                // 正序排列,倒序反过来
                return o2.getValue() - o1.getValue();
            }
        });

        // 遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储
        LinkedHashMap<Integer, Integer> linkedHashMap = new LinkedHashMap<Integer, Integer>();
        for (Map.Entry<Integer, Integer> e : entryList) {
            linkedHashMap.put(e.getKey(), e.getValue());
        }
        return linkedHashMap;
    }
}

六、效果展示

1、输入

1,1,2,4,4,4,2,2,3,3

2、输出

2,4,1,3

3、说明

根据题意:

  • 1出现2次
  • 2出现3次
  • 4出现3次
  • 3出现2次
  • 2和4都出现3次,2先出现,故是2,4
  • 1和3度出现2次,1先出现,故是1,3
  • 最后输出2,4,1,3

华为OD机试真题 Java 实现【数组去重和排序】【2023 B卷 100分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Java 实现【数组去重和排序】【2023 B卷 100分】-LMLPHP

08-14 09:56