世界已冷酷至极, 让我们携手前行。
自助收录

2023年华为OD机考真题:通信误码

算法刷题1年前 (2023)更新 江南白衣
378 0 0
2023年华为OD机考真题:通信误码

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:通信误码
时间限制: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]
解题思路:
1、使用map键值对求出频率最高的误码。
2、通过list的indexOf和lastIndexOf求出误码的区间长度

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.*;

/**
 * @title 通信误码
 * @Description 信号传播过程中会出现一些误码,不同的数字表示不同的误码ID,取值范围为1~65535,用一个数组记录误码出现的情况。
 * 每个误码出现的次数代表误码频度,请找出记录中包含频度最高误码的最小子数组长度。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // key:误码;value:误码频率
        Map<Integer, Integer> map = new HashMap<>();
        List<Integer> inputList = new ArrayList<>();    //通信误码列表
        int max = 0;    //误码次数的最大值
        for (int i = 0; i < n; i++) {
            int errorCode = sc.nextInt();
            inputList.add(errorCode);
            map.put(errorCode, map.getOrDefault(errorCode, 0) + 1);
            max = Math.max(max, map.get(errorCode));
        }

        List<Integer> maxList = new ArrayList<>();    //频率最高的误码集合
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == max) {
                maxList.add(entry.getKey());
            }
        }

        int min = Integer.MAX_VALUE;
        for (int maxCode : maxList) {
            int start = inputList.indexOf(maxCode);     //误码的第一个索引
            int end = inputList.lastIndexOf(maxCode);   //误码的最后一个索引
            min = Math.min(min, end - start + 1);      //误码区间
        }

        System.out.println(min);
    }

}

代码实现二:下面是满分解法

package com.codernav.demo.hwod.exam;

import java.util.*;

/**
 * @title 通信误码
 * @Description 信号传播过程中会出现一些误码,不同的数字表示不同的误码ID,取值范围为1~65535,用一个数组记录误码出现的情况。
 * 每个误码出现的次数代表误码频度,请找出记录中包含频度最高误码的最小子数组长度。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
        int max_count = 0;
        Map<Integer, Integer> num_count = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int count = num_count.getOrDefault(nums[i], 0) + 1;
            max_count = Math.max(max_count, count);
            num_count.put(nums[i], count);
        }
        Set<Integer> max_num = new HashSet<>();
        for (Map.Entry<Integer, Integer> entry : num_count.entrySet()) {
            if (entry.getValue() == max_count) {
                max_num.add(entry.getKey());
            }
        }
        int result = n;
        for (Integer integer : max_num) {

            int left = 0, right = n - 1;
            while (nums[left] != integer) {
                left++;
            }
            while (nums[right] != integer) {
                right--;
            }
            if (left <= right) {
                result = Math.min(result, right - left + 1);
            }
        }

        System.out.println(result);

    }

}
© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...