找磨损度最高和最低的硬盘 - 华为机试真题题解

分值: 100分

题解: Java / Python / C++

alt

题目描述

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

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

输入描述

一组硬盘磨损度的数组。

说明:

(1) 数组endurances中无重复值

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

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

输出描述

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

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

示例1

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

输出:
5 8 9
0 6 7

解释:
输入:1 50 40 68 72 86 35 14 87 99 63 75:表示一组硬盘磨损度的数组,其中的每个数值表示每个硬盘对应的磨损度。
输出:
5 8 9:表示磨损度最高三块盘的下标
0 6 7:表示磨损度最低的三块盘的下标

示例2

输入:
23 34 56 12 11 10

输出:
0 1 2
3 4 5

解释:
输入:23 34 56 12 11 10:表示一组硬盘磨损度的数组,其中的每个数值表示每个硬盘对应的磨损度。
输出:
0 1 2:表示磨损度最高三块盘的下标
3 4 5:表示磨损度最低的三块盘的下标

题解

简单构造题

将“磨损度” 和 “下标” 封装在一起然后根据“磨损度”排序,前三个是磨损度最低的三块盘, 后三个是磨损度最高的三块盘。

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {

    // 打印输出
    static void print(List<Integer> list) {
        int n = list.size();
        for (int i = 0; i < n; i++) {
            if (i + 1 == n) {
                System.out.println(list.get(i));
            } else {
                System.out.print(list.get(i) + " ");
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        List<int[]> endurances = new ArrayList<>();
        int t, i = 0;
        while (scanner.hasNextInt()) {
            t = scanner.nextInt();
            endurances.add(new int[]{t, i++});
        }

        Collections.sort(endurances, (a, b) -> Integer.compare(a[0], b[0]));

        List<Integer> resultMax = new ArrayList<>();
        List<Integer> resultMin = new ArrayList<>();
        int n = endurances.size();
        for (int j = 0; j < 3; j++) {
            resultMax.add(endurances.get(n - 1 - j)[1]);
            resultMin.add(endurances.get(j)[1]);
        }
        Collections.sort(resultMax);
        Collections.sort(resultMin);

        print(resultMax);
        print(resultMin);
    }
}

Python

endurances = list(map(int, input().split()))
items = sorted(zip(endurances, range(len(endurances))))

result_max = sorted([item[1] for item in items[-3:]])
result_min = sorted([item[1] for item in items[:3]])
print(*result_max)
print(*result_min)

C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 打印输出
void print(vector<int>& v) {
    int n = v.size();
    for(int i=0; i<n; i++) {
        if(i + 1 == n) {
            cout << v[i] << endl;
        } else {
            cout << v[i] << " ";
        }
    }
}

int main() {
    vector<pair<int,int>> endurances;
    int t = 0, i = 0;
    while(cin >> t) {
        endurances.push_back(make_pair(t, i++));
    }

    sort(endurances.begin(), endurances.end());

    vector<int> result_max;
    vector<int> result_min;
    int n = endurances.size();
    for(int i=0; i<3; i++) {
        result_max.push_back(endurances[n - 1 - i].second);
        result_min.push_back(endurances[i].second);
    }
    sort(result_max.begin(), result_max.end());
    sort(result_min.begin(), result_min.end());

    print(result_max);
    print(result_min);

    return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#秋招##校招##华为##面经##笔试#
全部评论
排序的时间复杂度是nlogn,可以用两个list分别保存最大三个值和最小三个值的下标,并用两个变量分别存储最大磨损中的三个值中的最小值下标和最小磨损的三个值中的最大值的下标,对列表进行一次遍历,每次只需要比较3~6次,时间复杂度为6n
点赞 回复 分享
发布于 2024-04-25 09:43 浙江
java Arrays.sort.....
点赞 回复 分享
发布于 2024-02-23 12:05 广东
Python 就是简洁
点赞 回复 分享
发布于 2023-12-26 12:01 湖北

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
fRank1e:吓得我不敢去外包了,但是目前也只有外包这一个实习,我还要继续去吗
点赞 评论 收藏
分享
评论
10
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务