华为OD机试 - 找磨损度最高和最低的硬盘 - 优先队列(Python/JS/C/C++ 2024 D卷 200分)

ops/2024/10/31 10:54:09/

在这里插入图片描述

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

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

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

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

二、输入描述

一组硬盘磨损度的数组。

说明:

(1) 数组endurances中无重复值

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

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

三、输出描述

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

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

四、测试用例

测试用例1:

1、输入

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

2、输出

5 8 9
0 6 7

测试用例2:

1、输入

9999 8888 7777 6666 5555 4444 3333

2、输出

0 1 2
4 5 6

3、说明

磨损度最高的三个值:9999(下标0)、8888(下标1)、7777(下标2)。
磨损度最低的三个值:5555(下标4)、4444(下标5)、3333(下标6)。

五、解题思路

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

六、Python算法源码

python">import heapqdef find_index(endurances, value):"""找到指定磨损度在数组中的下标"""for i, v in enumerate(endurances):if v == value:return ireturn -1def get_top_and_bottom_indexes(endurances):"""同时获取磨损度最高和最低的三个盘下标"""# 最小堆用于最高三个min_heap = []# 最大堆用于最低三个,Python中使用负数来模拟最大堆max_heap = []for value in endurances:# 维护最高三个heapq.heappush(min_heap, value)if len(min_heap) > 3:heapq.heappop(min_heap)  # 移除最小的,保留最大的三个# 维护最低三个heapq.heappush(max_heap, -value)if len(max_heap) > 3:heapq.heappop(max_heap)  # 移除最大的,保留最小的三个# 收集最高三个top3 = []while min_heap:top3.append(heapq.heappop(min_heap))top3.reverse()  # 降序# 收集最低三个bottom3 = []while max_heap:bottom3.append(-heapq.heappop(max_heap))bottom3.reverse()  # 升序# 获取对应的下标result = []for val in top3:result.append(find_index(endurances, val))for val in bottom3:result.append(find_index(endurances, val))# 对最高三个下标排序top_indexes = sorted(result[:3])# 对最低三个下标排序bottom_indexes = sorted(result[3:6])return top_indexes, bottom_indexesdef main():# 读取输入endurances = list(map(int, input().split()))top_indexes, bottom_indexes = get_top_and_bottom_indexes(endurances)# 输出结果print(' '.join(map(str, top_indexes)))print(' '.join(map(str, bottom_indexes)))if __name__ == "__main__":main()

七、JavaScript算法源码

javascript">function findIndex(endurances, value) {/*** 找到指定磨损度在数组中的下标*/for(let i=0;i<endurances.length;i++) {if(endurances[i] === value) {return i;}}return -1;
}function getTopAndBottomIndexes(endurances) {/*** 同时获取磨损度最高和最低的三个盘下标*/// 最小堆用于最高三个let minHeap = [];// 最大堆用于最低三个let maxHeap = [];for(let value of endurances) {// 维护最高三个minHeap.push(value);minHeap.sort((a,b) => a - b); // 升序if(minHeap.length >3) {minHeap.shift(); // 移除最小的}// 维护最低三个maxHeap.push(value);maxHeap.sort((a,b) => b - a); // 降序if(maxHeap.length >3) {maxHeap.shift(); // 移除最大的}}// 收集最高三个let top3 = minHeap.reverse(); // 降序// 收集最低三个let bottom3 = maxHeap.reverse(); // 升序// 获取对应的下标let result = [];for(let val of top3) {result.push(findIndex(endurances, val));}for(let val of bottom3) {result.push(findIndex(endurances, val));}// 对最高三个下标排序let top_indexes = result.slice(0,3).sort((a,b) => a - b);// 对最低三个下标排序let bottom_indexes = result.slice(3,6).sort((a,b) => a - b);return [top_indexes, bottom_indexes];
}// 主函数
function main() {const fs = require('fs');const input = fs.readFileSync('/dev/stdin', 'utf8').trim();const endurances = input.split(' ').map(Number);const [top_indexes, bottom_indexes] = getTopAndBottomIndexes(endurances);console.log(top_indexes.join(' '));console.log(bottom_indexes.join(' '));
}main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>// 函数用于比较两个整数,用于qsort
int compare(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}// 找到指定磨损度在数组中的下标
int findIndex(int endurances[], int length, int value) {for(int i=0;i<length;i++) {if(endurances[i] == value) {return i;}}return -1;
}int main(){int endurances[200];int n=0;// 读取输入while(scanf("%d", &endurances[n]) != EOF){n++;}// 复制数组用于排序int sorted_asc[200];int sorted_desc[200];for(int i=0;i<n;i++) {sorted_asc[i] = endurances[i];sorted_desc[i] = endurances[i];}// 升序排序qsort(sorted_asc, n, sizeof(int), compare);// 降序排序// 自定义比较函数int compare_desc(const void* a, const void* b){return (*(int*)b - *(int*)a);}qsort(sorted_desc, n, sizeof(int), compare_desc);// 获取最高三个int top3[3];for(int i=0;i<3;i++) {top3[i] = sorted_desc[i];}// 获取最低三个int bottom3[3];for(int i=0;i<3;i++) {bottom3[i] = sorted_asc[i];}// 获取对应的下标int top_indexes[3];int bottom_indexes[3];for(int i=0;i<3;i++) {top_indexes[i] = findIndex(endurances, n, top3[i]);}for(int i=0;i<3;i++) {bottom_indexes[i] = findIndex(endurances, n, bottom3[i]);}// 对下标排序// 简单冒泡排序for(int i=0;i<2;i++) {for(int j=0;j<2-i;j++) {if(top_indexes[j] > top_indexes[j+1]){int temp = top_indexes[j];top_indexes[j] = top_indexes[j+1];top_indexes[j+1] = temp;}if(bottom_indexes[j] > bottom_indexes[j+1]){int temp = bottom_indexes[j];bottom_indexes[j] = bottom_indexes[j+1];bottom_indexes[j+1] = temp;}}}// 输出结果for(int i=0;i<3;i++) {printf("%d", top_indexes[i]);if(i !=2) printf(" ");}printf("\n");for(int i=0;i<3;i++) {printf("%d", bottom_indexes[i]);if(i !=2) printf(" ");}return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;// 找到指定磨损度在数组中的下标
int findIndex(int endurances[], int length, int value){for(int i=0;i<length;i++){if(endurances[i] == value){return i;}}return -1;
}int main(){vector<int> endurances;int num;// 读取输入while(cin >> num){endurances.push_back(num);}int n = endurances.size();// 复制数组用于排序vector<int> sorted_asc = endurances;vector<int> sorted_desc = endurances;// 升序排序sort(sorted_asc.begin(), sorted_asc.end());// 降序排序sort(sorted_desc.begin(), sorted_desc.end(), greater<int>());// 获取最高三个vector<int> top3(sorted_desc.begin(), sorted_desc.begin()+3);// 获取最低三个vector<int> bottom3(sorted_asc.begin(), sorted_asc.begin()+3);// 获取对应的下标vector<int> top_indexes, bottom_indexes;for(auto val: top3){top_indexes.push_back(findIndex(&endurances[0], n, val));}for(auto val: bottom3){bottom_indexes.push_back(findIndex(&endurances[0], n, val));}// 对下标排序sort(top_indexes.begin(), top_indexes.end());sort(bottom_indexes.begin(), bottom_indexes.end());// 输出结果for(int i=0;i<top_indexes.size();i++){cout << top_indexes[i];if(i != top_indexes.size()-1) cout << " ";}cout << "\n";for(int i=0;i<bottom_indexes.size();i++){cout << bottom_indexes[i];if(i != bottom_indexes.size()-1) cout << " ";}return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述


http://www.ppmy.cn/ops/129846.html

相关文章

T8333FI凯钰TMtech升降压线性LED驱动芯片车规认证AEC-Q100

T8333FI是一款多功能的LED驱动芯片&#xff0c;主要用于驱动高功率LED。这款芯片支持多种转换配置&#xff0c;包括Boost、Buck、Buck-Boost以及SEPIC转换器&#xff0c;具有良好的恒定电流控制能力&#xff0c;恒流精度通常在3%以内。芯片输入电压范围广泛&#xff0c;支持从5…

【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现

开题报告 围场县拥有丰富的自然景观和野生动植物资源&#xff0c;同时面临着旅游业发展和自然保护之间的平衡问题&#xff0c;通过强调自然保护&#xff0c;这个平台可以教育游客如何尊重和保护当地的生态环境。同时&#xff0c;平台还可以提供关于生态保护的信息&#xff0c;…

【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval

文章目录 OverviewCurrent Retrieval-Augmented LMsArchitectureTraining Limitations & Future Work Overview Parametic language models的缺点&#xff1a; 事实性错误的普遍存在验证的难度&#xff08;可溯源性差&#xff09;难以在有顾虑的情况下排除某些序列适应调整…

java设计模式之监听者模式

有这么一个需求&#xff0c;客户注册的时候&#xff0c;产品经理要求给客户发送短信&#xff0c;发送优惠券&#xff0c;还有就是发送积分。根据xp极限编程原则&#xff0c;只管今天不管明天&#xff0c;伪代码原则上 //1&#xff0c;注册 register(); //2&#xff0c;发送优惠…

LVS Nginx HAProxy的优缺点

搭建负载均衡高可用环境相对简单&#xff0c;主要是要理解其中原理。此文描述了三种负载均衡器的优缺点&#xff0c;以便在实际的生产应用中&#xff0c;按需求取舍。 目前&#xff0c;在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LVS&#xff0c;Nginx及HAProxy,…

Lua 函数

Lua 函数 Lua 是一种轻量级的编程语言&#xff0c;广泛用于游戏开发、脚本编写和其他应用程序中。在 Lua 中&#xff0c;函数是一等公民&#xff0c;这意味着它们可以被赋值给变量&#xff0c;作为参数传递给其他函数&#xff0c;甚至可以作为其他函数的返回值。本文将详细介绍…

[瑞吉外卖]-10前后端分离

前后端分离 概念: 前后端分离开发&#xff0c;就是在项目开发过程中&#xff0c;对于前端代码的开发由专门的前端开发人员负责&#xff0c;后端代码则由后端开发人员负责 这样可以做到分工明确、各司其职&#xff0c;提高开发效率&#xff0c;前后端代码并行开发&#xff0c;…

随着飞行汽车的亮相,在环保方面有什么保护措施吗

飞行汽车具备环保潜力&#xff0c;采用电动或混合动力系统减少污染&#xff0c;并拓展应用场景。多家企业布局&#xff0c;沃飞长空作为国内eVTOL(电动垂直起降航空器)研发的领先企业&#xff0c;在环保这一点做的非常到位&#xff0c;AE200采用纯电动力系统,零碳排放,静默飞行…