一、题目描述
信号传播过程中会出现一些误码,不同的数字表示不同的误码ID,取值范围为1~65535,用一个数组记录误码出现的情况。
每个误码出现的次数代表误码频度,请找出记录中包含频度最高误码的最小子数组长度。
二、输入描述
误码总数目:
取值范围为0 - 255,取值为0表示没有误码的情况。
误码出现频率数组:
误码ID范围为1 - 65535,数组长度为1~1000。
三、输出描述
包含频率最高的误码最小子数组长度。
四、解题思路
- 读取输入的误码总数目 n;
- 初始化一个 HashMap errorMap,用于记录误码出现的次数;
- 初始化一个 ArrayList sourceList,用于记录误码出现的顺序;
- 初始化变量 max 为 0,用于记录误码的最大频度;
- 循环 n 次,读取误码,并进行以下操作:
- 将误码添加到 sourceList 中;
- 如果 errorMap 中已经存在该误码,则将对应的次数加 1;否则,将该误码添加到 errorMap 中,并将次数设置为 1;
- 更新 max 的值为当前误码出现次数和 max 中的较大值;
- 创建一个 ArrayList list,用于记录出现频率最高的误码;
- 遍历 errorMap 中的每个键值对,如果次数等于 max,将误码添加到 list 中;
- 初始化变量 ret 为整型最大值 Integer.MAX_VALUE,用于记录最小子数组长度;
- 遍历 list 中的每个误码,并进行以下操作:
- 找到该误码在 sourceList 中第一次出现的位置 start 和最后一次出现的位置 end;
- 计算子数组长度为 end - start + 1;
- 更新 ret 的值为当前子数组长度和 ret 中的较小值;
- 输出最小子数组长度 ret;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 误码数组长度
int n = sc.nextInt();
Map<Integer, Integer> errorMap = new HashMap<Integer, Integer>();
// 误码数组
List<Integer> sourceList = new ArrayList<Integer>();
// 误码次数最大值
int max = 0;
for (int i = 0; i < n; i++) {
int errorCode = sc.nextInt();
sourceList.add(errorCode);
if (errorMap.containsKey(errorCode)) {
errorMap.put(errorCode, errorMap.get(errorCode) + 1);
} else {
errorMap.put(errorCode, 1);
}
max = Math.max(max, errorMap.get(errorCode));
}
// 出现次数最多的错误号记录
List<Integer> list = new ArrayList<Integer>();
for (Map.Entry<Integer, Integer> entry : errorMap.entrySet()) {
if (entry.getValue() == max) {
list.add(entry.getKey());
}
}
int ret = Integer.MAX_VALUE;
for (Integer integer : list) {
int start = sourceList.indexOf(integer);
int end = sourceList.lastIndexOf(integer);
ret = Math.min(ret, end - start + 1);
}
System.out.println(ret);
}
六、效果展示
1、输入
5
1 2 2 4 1
2、输出
2
3、说明
频度最高的有1和2,频度是2(出现的次数都是2)。可以包含频度最高的记录数组是[2 2]和[1 2 2 4 1],最短是[2 2],最小长度为2。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。