华为OD机试 2025A卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和,需要对数组进行去重。
说明:
- 数组中数字范围[0, 1000]
- 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1
- 输入非法返回-1
二、输入描述
- 第一行输入M, M表示数组大小
- 第二行输入M个数,表示数组内容
- 第三行输入N,N表示需要计算的最大、最小N个数
三、输出描述
输出最大N个数与最小N个数的和。
四、测试用例
测试用例1:
1、输入
7
47 17 26 9 18 47 52
4
2、输出
-1
测试用例2:
1、输入
8
100 200 300 400 500 100 200 300
2
2、输出
1200
五、解题思路
本题的关键点是通过数据结构Set进行去重,通过TreeSet进行升序排序。
- 第一行输入数组大小M;
- 第二行输入M个数字,空格隔开;
- 第三行输入需要计算的最大、最小N个数;
- 需要对数组进行去重,因此用Set将第二行的M个数字加入Set;
- 将Set进行升序排序,方便计算最大的和最小的N个数之和;
- 遍历升序的treeSet;
- 取最小的N个数之和;
- 取最大的N个数之和;
- 再将两者相加,得出结果。
例如:
7
47 17 26 9 18 47 52
3
六、Python算法源码
def calculate_sum(M, array, N):
# 非法输入校验
if M <= 0 or N <= 0 or 2 * N > len(set(array)):
return -1
# 去重并排序
array = sorted(set(array))
# 计算最小N个数与最大N个数的和
sum_small = sum(array[:N])
sum_big = sum(array[-N:])
return sum_small + sum_big
七、JavaScript算法源码
function calculateSum(M, array, N) {
if (M <= 0 || N <= 0 || 2 * N > new Set(array).size) {
return -1;
}
// 去重并排序
let uniqueArray = [...new Set(array)].sort((a, b) => a - b);
// 计算最小N个数与最大N个数的和
let sumSmall = uniqueArray.slice(0, N).reduce((a, b) => a + b, 0);
let sumBig = uniqueArray.slice(-N).reduce((a, b) => a + b, 0);
return sumSmall + sumBig;
}
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int calculateSum(int M, int array[], int N) {
if (M <= 0 || N <= 0) return -1;
// 去重
int unique[1000], count = 0;
for (int i = 0; i < M; i++) {
int found = 0;
for (int j = 0; j < count; j++) {
if (array[i] == unique[j]) {
found = 1;
break;
}
}
if (!found) unique[count++] = array[i];
}
if (2 * N > count) return -1;
// 排序
qsort(unique, count, sizeof(int), compare);
// 计算最小N个数与最大N个数的和
int sumSmall = 0, sumBig = 0;
for (int i = 0; i < N; i++) {
sumSmall += unique[i];
sumBig += unique[count - 1 - i];
}
return sumSmall + sumBig;
}
九、C++算法源码
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int calculateSum(int M, vector<int> array, int N) {
if (M <= 0 || N <= 0) return -1;
// 去重
set<int> uniqueSet(array.begin(), array.end());
if (2 * N > uniqueSet.size()) return -1;
// 转为排序后的数组
vector<int> uniqueArray(uniqueSet.begin(), uniqueSet.end());
// 计算最小N个数与最大N个数的和
int sumSmall = 0, sumBig = 0;
for (int i = 0; i < N; i++) {
sumSmall += uniqueArray[i];
sumBig += uniqueArray[uniqueArray.size() - 1 - i];
}
return sumSmall + sumBig;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2025 A卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。