【华为OD机试真题 Java语言】6、数组去重和排序 | 机试真题+思路参考+代码解析

该博客介绍了如何用Java解决华为在线开发者(OD)机试中的数组去重并按出现次数排序的问题。通过使用LinkedHashMap保持元素顺序,结合CountMap记录数字频率,对数据进行处理和排序,最后输出去重并排序后的数组。
摘要由CSDN通过智能技术生成


🍂个人博客首页: KJ.JK
 
🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


🎃题目描述

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


🎃输入输出

输入
一个数组
 
输出
去重排序后的数组


🎃样例1

输入
1,3,3,3,2,4,4,4,5


输出
3,4,1,2,5


说明:
数组大小不超过100 数组元素值大小不超过100

二、思路参考


1、首先,使用LinkedHashMap来保持元素插入的顺序,并创建一个countMap用于记录每个数字出现的次数

2、遍历输入的nums列表,对于每个数字,将其作为键,将其在countMap中的值(即出现次数)加1

3、将countMap的条目(键值对)转换为countList,这样我们就可以对条目进行排序。使用ArrayList来存储countList,以保留顺序

4、对countList进行排序,首先按照出现次数从高到低排序。如果出现次数相同,则按照数字在原始列表中的第一次出现的顺序排序

5、创建一个新的result列表,用于存储排序后的非重复数字

6、遍历排序后的countList,依次将数字添加到result列表中

7、返回result列表作为最终结果


三、代码参考

import java.util.*;

public class Main {

    public static List<Integer> removeDuplicates(List<Integer> nums) {
        // 使用 LinkedHashMap 以保持元素插入的顺序
        Map<Integer, Integer> countMap = new LinkedHashMap<>();

        // 统计每个数字的出现次数
        for (Integer num : nums) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }

        // 将条目转换为列表,以便排序
        List<Map.Entry<Integer, Integer>> countList = new ArrayList<>(countMap.entrySet());

        // 根据出现次数和首次出现顺序对条目进行排序
        countList.sort((a, b) -> {
            int countDiff = b.getValue() - a.getValue();
            if (countDiff != 0) {
                return countDiff;
            }
            return nums.indexOf(a.getKey()) - nums.indexOf(b.getKey());
        });

        // 提取排序后的数字作为最终结果
        List<Integer> result = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : countList) {
            result.add(entry.getKey());
        }

        return result;
    }

    public static void main(String[] args) {
        List<Integer> nums = Arrays.asList(1, 3, 3, 3, 2, 4, 4, 4, 5);

        // 调用函数并输出结果
        List<Integer> result = removeDuplicates(nums);
        String output = result.toString().replaceAll("[\\[\\]\\s]", "");
        System.out.println(output);
    }
}


import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 创建一个Scanner对象,用于从控制台读取输入
        Scanner scanner = new Scanner(System.in);
        // 读取用户输入的一行文本
        String input = scanner.nextLine();

        // 通过逗号分隔输入字符串,并将其转换为整型数组
        String[] inputStrings = input.split(",");
        int[] inputArray = new int[inputStrings.length];

        // 将字符串数组转换为整型数组
        for (int i = 0; i < inputStrings.length; i++) {
            inputArray[i] = Integer.parseInt(inputStrings[i].trim());
        }

        // 调用处理方法并获取结果
        int[] result = removeDuplicatesAndSortByFrequency(inputArray);

        // 打印结果

        for (int i = 0; i < result.length; i++) {
            // 输出每个元素,元素之间用逗号分隔
            System.out.print(result[i]);
            if (i < result.length - 1) {
                System.out.print(",");
            }
        }
    }

    public static int[] removeDuplicatesAndSortByFrequency(int[] array) {
        // 使用LinkedHashMap来保持元素的插入顺序,并记录每个元素的频率
        Map<Integer, Integer> frequencyMap = new LinkedHashMap<>();

        // 遍历输入数组
        for (int num : array) {
            // 更新元素的频率,如果元素不在Map中则初始化为0再加1
            frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
        }

        // 将Map的键值对转换为List<Map.Entry<Integer, Integer>>类型,方便排序
        List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(frequencyMap.entrySet());

        // 根据频率进行排序,如果频率相同则按插入顺序排序
        entryList.sort((entry1, entry2) -> {
            // 比较频率
            int frequencyComparison = Integer.compare(entry2.getValue(), entry1.getValue());
            // 如果频率相同则保持原顺序,否则按频率降序排序
            return frequencyComparison != 0 ? frequencyComparison : 1;
        });

        // 创建结果数组
        int[] result = new int[entryList.size()];
        // 将排序后的键值对的键(即原数组的元素)提取到结果数组中
        for (int i = 0; i < entryList.size(); i++) {
            result[i] = entryList.get(i).getKey();
        }

        // 返回结果数组
        return result;
    }
}



作者:KJ.JK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KJ.JK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值