华为OD机试 - 找磨损度最高和最低的硬盘 - 优先队列(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

存储阵列上使用的一批固态硬盘,根据硬盘磨损值给定一个数组endurances,数组中每个元素表示单块硬盘的磨损度(0到10000之间)。

磨损度越大,表示此盘需要更换的概率越高。需要找出磨损度最高三块盘下标和磨损度最低的三块盘下标。

二、输入描述

一组硬盘磨损度的数组。

说明:

(1) 数组endurances中无重复值

(2) 数组的长度范围:[6,200]

(3) 数组的下标从0开始。

三、输出描述

第一行:磨损度最高三块盘下标,按下标升序展示

第二行:磨损度最低的三块盘下标,按下标升序展示

1、输入

1 50 40 68 72 86 35 14 87 99 63 75

2、输出

5 8 9

0 6 7

四、解题思路

  1. 创建一个大小为 3 的最小堆(min heap)和一个大小为 3 的最大堆(max heap),用于存储磨损度最高的三块盘和最低的三块盘。
  2. 遍历硬盘磨损度的数组,将每个磨损度元素添加到堆中。
  3. 如果堆的大小超过 3,则将堆顶元素弹出,保持堆的大小为 3。
  4. 最后,将堆中的元素按顺序弹出,得到磨损度最高三块盘和最低三块盘的下标。
  5. 输出结果。

五、Java算法源码

java 复制代码
public class OdTest01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] endurances = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        int[] maxIndexes = getMaxIndexes(endurances);
        int[] minIndexes = getMinIndexes(endurances);

        // 输出结果
        System.out.println(Arrays.toString(minIndexes));
        System.out.println(Arrays.toString(maxIndexes));
    }

    // 获取磨损度最高三块盘下标
    public static int[] getMaxIndexes(int[] endurances) {
        // 创建一个最大堆
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
        // 遍历磨损度数组,将每个元素添加到最大堆中
        for (int i = 0; i < endurances.length; i++) {
            maxHeap.offer(endurances[i]);
            // 如果堆的大小超过 3,则弹出堆顶元素
            if (maxHeap.size() > 3) {
                maxHeap.poll();
            }
        }
        // 将堆中的元素按顺序弹出,得到磨损度最高三块盘的下标
        int[] indexes = new int[3];
        for (int i = 0; i < 3; i++) {
            indexes[i] = findIndex(endurances, maxHeap.poll());
        }
        // 按下标升序排序
        Arrays.sort(indexes);
        return indexes;
    }

    // 获取磨损度最低三块盘下标
    public static int[] getMinIndexes(int[] endurances) {
        // 创建一个最小堆
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        // 遍历磨损度数组,将每个元素添加到最小堆中
        for (int i = 0; i < endurances.length; i++) {
            minHeap.offer(endurances[i]);
            // 如果堆的大小超过 3,则弹出堆顶元素
            if (minHeap.size() > 3) {
                minHeap.poll();
            }
        }
        // 将堆中的元素按顺序弹出,得到磨损度最低三块盘的下标
        int[] indexes = new int[3];
        for (int i = 0; i < 3; i++) {
            indexes[i] = findIndex(endurances, minHeap.poll());
        }
        // 按下标升序排序
        Arrays.sort(indexes);
        return indexes;
    }

    // 找到指定磨损度在数组中的下标
    public static int findIndex(int[] endurances, int value) {
        for (int i = 0; i < endurances.length; i++) {
            if (endurances[i] == value) {
                return i;
            }
        }
        return -1;
    }
}

六、效果展示

1、输入

23 34 56 12 11 10

2、输出

0 1 2

3 4 5

3、说明

0 1 2:表示磨损度最高三块盘的下标

3 4 5:表示磨损度最低的三块盘的下标

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
派大星爱吃鱼2 分钟前
素数检验方法
算法
摇滚侠8 分钟前
Vue 项目实战《尚医通》,完成确定挂号业务,笔记46
java·开发语言·javascript·vue.js·笔记
正在走向自律15 分钟前
豆包编程模型Doubao-Seed-Code深度体验,从零开始构建全栈项目的完整指南
java·服务器·数据库·doubao·claude code·火山方舟
钱多多_qdd19 分钟前
基础篇:IoC(九):应用上下文ApplicationContext
java·spring
q***558933 分钟前
SpringSecurity 实现token 认证
java
Greedy Alg33 分钟前
LeetCode 72. 编辑距离(中等)
算法
合作小小程序员小小店33 分钟前
web网页开发,在线%医院诊断管理%系统,基于Idea,html,css,jQuery,java,jsp,ssh,mysql。
java·前端·css·数据库·jdk·html·intellij-idea
xinxingrs34 分钟前
贪心算法、动态规划以及相关应用(python)
笔记·python·学习·算法·贪心算法·动态规划
秋邱1 小时前
驾驭数据洪流:Python如何赋能您的数据思维与决策飞跃
jvm·算法·云原生·oracle·eureka·数据分析·推荐算法
程序猿_极客1 小时前
【2025最新】 Java入门到实战:包装类、字符串转换、equals/toString + 可变字符串,一篇搞定开发高频场景(含案例解析)
java·开发语言·java进阶·面试核心·java快速入门