目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。
二、输入描述
一个数组。
三、输出描述
去重排序后的数组。
四、解题思路
整体的解题思路:
- 输入一个数组,通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
- 定义一个map,存储每个数字出现的次数,key是数字,value是数字出现的次数;
- 根据题意要用到数组中数字出现的顺序,故使用 LinkedHashMap 来实现插入顺序和遍历顺序一致的 HashMap;
- 单独定义一个函数,根据map的值value进行降序排序;
- 利用Map的entrySet方法,转化为list进行排序;
- 利用Collections的sort方法对list排序;
- 遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储;
- 返回linkedHashMap;
- 遍历排序好的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卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。