🍂个人博客首页: 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;
}
}