最大N个数与最小N个数的和 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

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

说明:

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

最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1

输入非法返回-1

输入描述

第一行输入M, M标识数组大小

第二行输入M个数,标识数组内容

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

输出描述

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

示例1

输入
5
95 88 83 64 100
2输出
342说明
最大2个数[100,95],最小2个数[83,64], 输出为342。

示例2

输入
5
3 2 3 4 2
2输出
-1说明
最大2个数[4,3],最小2个数[3,2], 有重叠输出为-1。

题解

题目主要要求计算给定数组中最大N个数和最小N个数的和,同时需要处理可能的重叠情况。给出了 Java、Python 和 C++ 的解法,它们的基本思路是一致的,通过排序数组并使用两个集合(最小N个数的集合和最大N个数的集合)来进行计算。以下是对解法的总结:

  1. 排序数组:首先对输入的数组进行排序,这样方便后续取最大和最小的N个数。
  2. 使用两个集合:分别维护一个最小N个数的集合和最大N个数的集合。这里使用集合是为了去重,确保不同的数值只会计算一次。
  3. 检查重叠:在计算最小N个数和最大N个数的和之前,检查两个集合是否有交集。如果有交集,说明存在重叠,返回-1。
  4. 计算和:如果没有重叠,计算最小N个数和最大N个数的和,并输出。

注意事项:

  • 在 C++ 中,需要进行类型转换来避免警告,特别是在比较 minSet.size()maxSet.size()n 时。
  • 在 Java 中,使用 Collections.disjoint 方法来检查两个集合是否有交集。

这个问题的解法思路相对清晰,通过排序和集合的操作,能够较为高效地解决问题。

Java

import java.util.*;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int m = scanner.nextInt();int[] arr = new int[m];for (int i = 0; i < m; i++) {arr[i] = scanner.nextInt();}int n = scanner.nextInt();Arrays.sort(arr);// 最小的N个数, 最大的N个数Set<Integer> minSet = new HashSet<>();Set<Integer> maxSet = new HashSet<>();for (int i = 0; i < m; i++) {if (minSet.size() < n) {minSet.add(arr[i]);}if (maxSet.size() < n) {maxSet.add(arr[m - 1 - i]);}}if (!Collections.disjoint(minSet, maxSet)) {  // 比较两个集合是否有交集System.out.println(-1);} else {int sum = minSet.stream().mapToInt(Integer::intValue).sum() + maxSet.stream().mapToInt(Integer::intValue).sum();System.out.println(sum);}}
}

Python

m = int(input())
arr = list(map(int, input().split()))
n = int(input())
arr.sort()# 最小的N个数, 最大的N个数
min_n, max_n = set(), set()
for i in range(m):if len(min_n) < n:min_n.add(arr[i])if len(max_n) < n:max_n.add(arr[m-1-i])if set(min_n) & set(max_n):print(-1)
else:print(sum(min_n) + sum(max_n))

C++

#include <bits/stdc++.h>using namespace std;int main() {int m;cin >> m;vector<int> arr(m);for (int i = 0; i < m; i++) {cin >> arr[i];}int n;cin >> n;sort(arr.begin(), arr.end());// 最小的N个数, 最大的N个数set<int> minSet, maxSet;for (int i = 0; i < m; i++) {if (minSet.size() < static_cast<size_t>(n)) {minSet.insert(arr[i]);}if (maxSet.size() < static_cast<size_t>(n)) {maxSet.insert(arr[m - 1 - i]);}}// 比较两个集合是否有交集bool hasIntersection = false;for (int num : minSet) {if (maxSet.find(num) != maxSet.end()) {hasIntersection = true;break;}}if (hasIntersection) {cout << -1 << endl;} else {int sum = 0;for (int num : minSet) {sum += num;}for (int num : maxSet) {sum += num;}cout << sum << endl;}return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse--09--SQL DML 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DML 操作1.Insert 插入2.update 更新3.delete 删除 SQL DML 操作 DML:Data Manipulation Language,数据操纵语言。 List itemClickHouse 中 DML 语言包含插入…

【JavaEE】_线程与多线程的创建

目录 1. 线程的概念 2. 创建与使用多线程 2.1 方式1&#xff1a;继承Thread类 2.2 方式2&#xff1a; 实现Runnable接口 2.3 以上两种创建线程方式的对比 3. 多线程的优势-增加运行速度 1. 线程的概念 进程的存在是由于系统的多任务执行需求&#xff0c;这也要求程序员进…

php基础学习之作用域和静态变量

作用域 变量&#xff08;常量&#xff09;能够被访问的区域&#xff0c;变量可以在常规代码中定义&#xff0c;也可以在函数内部定义 变量的作用域 在 PHP 中作用域严格来说分为两种&#xff0c;但是 PHP内部还定义一些在严格意义之外的一种&#xff0c;所以总共算三种—— 局部…

html从零开始9:javaScript简介,语句、标识符,变量,JavaScript引入到文件【搬代码】

javaScript简介 javaScript语句、标识符 变量 var num 10; var就是固定声明,num就是变量名&#xff0c;10就是变量&#xff1b;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

云计算基础-计算虚拟化-CPU虚拟化

CPU指令系统 在CPU的工作原理中&#xff0c;CPU有不同的指令集&#xff0c;如下图&#xff0c;CPU有4各指令集&#xff1a;Ring0-3&#xff0c;指令集是在服务器上运行的所有命令&#xff0c;最终都会在CPU上执行&#xff0c;但是CPU并不是说所有的命令都是一视同仁的&#xf…

Arrays工具类的常见方法总结

一、Arrays.asList( ) 1、作用 Arrays.asList( )可以将一个数组以集合的形式传入一个集合对象。通常用来将一组元素全部添加到集合中。 2、参数及返回值 参数&#xff1a;一组动态参数 返回值&#xff1a;List<T>集合 3、应用举例 List<String> boyListArra…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…

Dynamo读取Revit警告

Hello大家好&#xff01;我是九哥~ 之前看到群里小伙伴经常会问如何去掉Revit重复的图元&#xff0c;有推荐各种插件的&#xff0c;其实的&#xff0c;Revit本身就会提示你有哪些图元是重复的&#xff0c;就在管理选项卡下面的警告里&#xff0c;即查阅警告信息。 点击警告后…

使用html-webpack-plugin对HTML文件进行预处理

原文地址&#xff1a;https://segmentfault.com/a/1190000021518323作者&#xff1a;Fw恶龙本文首发于&#xff1a;思否 一、前言 先整理一波之前和webpack相关的文章: 使用Webpack对CSS文件进行后处理基于Webpack的CSS Sprites实现方案Stylus系列——webpack-spritesmith配合…

二、ActiveMQ安装

ActiveMQ安装 一、相关环境二、安装Java8三、下载安装包四、启动五、其他命令六、开放端口七、后台管理 一、相关环境 环境&#xff1a;Centos7.9安装ActiveMQ版本&#xff1a;5.15.9JDK8 二、安装Java8 安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/…

软件工程师,OpenAI Sora驾到,快来围观

概述 近期&#xff0c;OpenAI在其官方网站上公布了Sora文生视频模型的详细信息&#xff0c;展示了其令人印象深刻的能力&#xff0c;包括根据文本输入快速生成长达一分钟的高清视频。Sora的强大之处在于其能够根据文本描述&#xff0c;生成长达60秒的视频&#xff0c;其中包含&…

字符串拼接 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给定 M 个字符( a-z ) &#xff0c;从中取出任意字符(每个字符只能用一次)拼接成长度为 N 的字符串&#xff0c;要求相同的字符不能相邻。 计算出给定的字符列表…