一、题目描述
信号传播过程中会出现一些误码,不同的数字表示不同的误码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;
五、JavaScript算法源码
// 误码总数目 n
function calculate(n, sourceList) {
// 用于记录误码出现的次数
const errorMap = new Map();
// 用于记录误码的最大频度
let max = 0;
for (let i = 0; i < n; i++) {
const errorCode = sourceList[i];
if (errorMap.has(errorCode)) {
errorMap.set(errorCode, errorMap.get(errorCode) + 1);
} else {
errorMap.set(errorCode, 1);
}
max = Math.max(max, errorMap.get(errorCode));
}
// 用于记录误码出现的顺序
const list = [];
for (const [errorCode, count] of errorMap.entries()) {
if (count === max) {
list.push(errorCode);
}
}
let ret = Infinity;
for (const errorCode of list) {
const start = sourceList.indexOf(errorCode);
const end = sourceList.lastIndexOf(errorCode);
ret = Math.min(ret, end - start + 1);
}
return ret;
}
感谢刷题群小伙伴提供的简化算法。
function findMinSubarrayLength(n, sourceList) {
const errorMap = new Map();
let max = 0;
for (const errorCode of sourceList) {
errorMap.set(errorCode, (errorMap.get(errorCode) || 0) + 1);
max = Math.max(max, errorMap.get(errorCode));
}
const list = Array.from(errorMap.entries()).filter(([, count]) => count === max).map(([errorCode]) => errorCode);
let ret = Infinity;
for (const errorCode of list) {
const start = sourceList.indexOf(errorCode);
const end = sourceList.lastIndexOf(errorCode);
ret = Math.min(ret, end - start + 1);
}
return 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机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。