华为OD题目: 通信误码

该文章提供了一种解决华为在线判题(OD)问题的方法,涉及通信误码的处理。程序使用Java编写,首先通过HashMap统计误码频度,然后找出最高频次的误码,存储其出现的索引,最后计算包含最高频误码的最小子数组长度。

华为OD题目: 通信误码

package com.sf.ccmas.video.config.odd.od15;

import java.util.*;

/**
 * 通信误码
 * 时间限制:1s空间限制: 32MB 限定语言: 不限
 * 题目描述:
 * 信号传播过程中会出现一些误码,不同的数字表示不同的误码ID,取值范围为1~65535,用一个数组记录误码出现的情况。
 * 每个误码出现的次数代表误码频度,请找出记录中包含频度最高误码的最小子数组长度。
 * 输入描述:
 * 误码总数目:取值范围为0~255,取值为0表示没有误码的情况误码出现频率数组:误码ID范围为1~65535,数组长度为1~1000。输出描述
 * 包含频率最高的误码最小子数组长度
 * 示例1
 * 输入:
 * 5
 * 1 2 2 4 1
 * 输出:
 * 2
 * 说明:
 * 频度最高的有1和2,频度是2(出现的次数都是2)。可以包含频度最高的记录数组是[2 2]和[1 2 2 4 1],最短是[2 2],最小长度为2
 *
 * 示例2
 * 输入:
 * 7
 * 1 2 2 4 2 1 1
 * 输出:
 * 4
 * 说明:
 * 频度最高的是1和2。最短的是:[2 2 4 2]
 *
 * 解题思路:
 * 先用map 帅选出最大频次的数字
 * 然后遍历数组,用一个 maxNumMap 来存放<key=最高频次的数字, value=list,用来记录数字在数组里的各个下标>
 * 最后遍历maxNumMap,这个在计算下标的差值,maxIndex-minIndex+1,取差值最小的一个即为最小长度
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] split = line.split(" ");
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < split.length; i++) {
            int num = Integer.parseInt(split[i]);
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
        list.sort((a1, a2) -> a2.getValue() - a1.getValue());
        int max = list.get(0).getValue();
        //计算这个的时候
        Map<Integer, List<Integer>> maxNumMap = new HashMap<>();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue().equals(max)) {
                maxNumMap.put(entry.getKey(), new ArrayList<>());
            }else {
                break;
            }
        }
        for (int i = 0; i < split.length; i++) {
            int num = Integer.parseInt(split[i]);
            if (maxNumMap.containsKey(num)) {
                List<Integer> indexList = maxNumMap.get(num);
                indexList.add(i);
            }
        }
        int res = Integer.MAX_VALUE;
        //通过计算最大最大频次数的,最大下标减去最小下标+1,比较最小的长度
        for (List<Integer> indexList : maxNumMap.values()) {
            int val = indexList.get(indexList.size() - 1) - indexList.get(0) + 1;
            res = Math.min(val, res);
        }
        System.out.println(res);



    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值