当前位置: 首页 > 面试经验 >

最新华为OD机试真题-最大/小 N 个数的和(100分)

优质
小牛编辑
102浏览
2024-06-28

最新华为OD机试真题-最大/小 N 个数的和(100分)

大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新 华为OD机试-D卷 的三语言AC题解

感谢大家的订阅➕ 和 喜欢

在线评测链接

=> 最大 N 个数与最小 N 个数的和(100分) <=

评测功能需要 =>订阅专栏<= 后联系清隆解锁~

OJ题目截图

最大 N 个数与最小 N 个数的和

问题描述

给定一个数组,编写一个函数来计算它的最大 个数与最小 个数的和。你需要对数组进行去重。

说明:

  • 数组中数字范围 [0, 1000]。
  • 最大 个数与最小 个数不能有重叠,如有重叠,输入非法返回 -1。
  • 输入非法返回 -1。

输入格式

第一行输入 表示数组大小。

第二行输入 个数,表示数组内容。

第三行输入 表示需要计算的最大、最小 个数。

输出格式

输出最大 个数与最小 个数的和。

样例输入

输入

5
95 88 83 64 100
2

输出

342

输入

5
3 2 3 4 2
2

输出

-1

数据范围

数组中数字范围 [0, 1000]。

题解

题目要求计算数组中最大 个数与最小 个数的和,并且这两个部分不能有重叠。首先需要对数组进行去重,然后检查去重后的数组长度是否满足 2 * 的要求。如果满足,则计算最大 个数与最小 个数的和;否则返回 -1。

参考代码

  • Python
def max_min_sum(arr, n):
    arr = list(set(arr))
    arr.sort()
    if 2 * n > len(arr):
        return -1
    return sum(arr[:n]) + sum(arr[-n:])

if __name__ == "__main__":
    m = int(input())
    arr = list(map(int, input().split()))
    n = int(input())
    print(max_min_sum(arr, n))
  • Java
import java.util.Arrays;
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int[] arr = new int[m];
        for (int i = 0; i < m; i++) {
            arr[i] = sc.nextInt();
        }
        int n = sc.nextInt();
        System.out.println(maxMinSum(arr, n));
    }

    public static int maxMinSum(int[] arr, int n) {
        Set<Integer> set = new HashSet<>();
        for (int num : arr) {
            set.add(num);
        }
        Integer[] uniqueArr = set.toArray(new Integer[0]);
        Arrays.sort(uniqueArr);
        if (2 * n > uniqueArr.length) {
            return -1;
        }
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += uniqueArr[i];
        }
        for (int i = uniqueArr.length - n; i < uniqueArr.length; i++) {
            sum += uniqueArr[i];
        }
        return sum;
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

int maxMinSum(vector<int>& arr, int n) {
    set<int> uniqueSet(arr.begin(), arr.end());
    vector<int> uniqueArr(uniqueSet.begin(), uniqueSet.end());
    if (2 * n > uniqueArr.size()) {
        return -1;
    }
    sort(uniqueArr.begin(), uniqueArr.end());
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += uniqueArr[i];
    }
    for (int i = uniqueArr.size() - n; i < uniqueArr.size(); ++i) {
        sum += uniqueArr[i];
    }
    return sum;
}

int main() {
    int m;
    cin >> m;
    vector<int> arr(m);
    for (int i = 0; i < m; ++i) {
        cin >> arr[i];
    }
    int n;
    cin >> n;
    cout << maxMinSum(arr, n) << endl;
    return 0;
}
#华为OD##华为##春招##秋招##笔试#
 类似资料: