【华为OD题库-031】比赛的冠亚季军-java
题目
有N(3<=N<10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下轮;实力值大的获胜,实力值相等的情况,id小的情况下获胜:轮空的直接进入下一轮.
输入描述:
输入一行N个数字代表N的运动员的实力值(0<=实力值<=10000000000).
输出描述:
输出冠亚季军的id,用空格隔开.
示例1
输入:
2 3 4 5
输出:
3 1 2
说明:
第一轮比赛,id为0实力值为2的运动员和id为1实力值为3的运动员比赛,1号胜出进入下一轮争夺冠亚军,id为2的运动员和id为3的运动员比赛,3号胜出进入下一轮争夺冠亚军;
冠亚军比赛,3号胜1号:故冠军为3号,亚军为1号。
2号和0号,比赛进行季军的争夺,2号实力值为4,0号实力值2,故2号胜出,得季军。
冠亚季军为3 1 2。
思路
每轮相邻的运动员分入一组比赛,每轮结束后,数组的长度由len变为(len+1)/2,加一的原因为轮空的直接进入下一轮。具体来讲:
假设len为偶数8,那么每轮len的变化过程为:8>4>2>1,长度为2时,争夺冠亚,长度为1时,得到冠军,长度为4时,可以得到4强,季军为4强中非冠亚的较大值。
假设len为基数9,那么每轮len的变化过程为:9>5>3>2>1,长度为2时,争夺冠亚,长度为1时得到冠军,长度为3时,3个运动员中减去冠亚就得到季军。
所以当数组长度降低为3或4时,最终的冠亚季军都在这个数组中,可以先保存数组的值。然后继续下一轮,当进行到最后一轮时(len=1),得到了冠军,再反推回来,就可以分别得到亚军和季军。
考虑到实力分值范围最大值为10000000000,超过了Integer,所以实力分值应该用long表示
题解
package hwod;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;public class Competition2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToLong(Long::parseLong).toArray();int[] res = competition(nums);for (int i = 0; i < res.length; i++) {if (i != 0) System.out.print(" ");System.out.print(res[i]);}}private static int[] competition(long[] nums) {int[] res = new int[3];//存储最终的冠亚季军idint[] indexs = new int[nums.length];//记录每个人的id,每轮淘汰时,淘汰id即可for (int i = 0; i < nums.length; i++) {indexs[i] = i;}List<Integer> lst4 = new ArrayList<>();//存储4强while (indexs.length > 1) {if (indexs.length == 4 || indexs.length == 3) {lst4 = Arrays.stream(indexs).boxed().collect(Collectors.toList());}int[] newIndexs = new int[(indexs.length + 1) / 2]; //每轮淘汰一半的人数for (int i = 0; i < indexs.length; i += 2) {if (i + 1 < indexs.length && nums[indexs[i]] < nums[indexs[i + 1]]) {newIndexs[i / 2] = indexs[i + 1];} else {newIndexs[i / 2] = indexs[i];}}if (newIndexs.length == 1) {//得出冠军res[0] = newIndexs[0];//得到亚军,此时indexs长度必为2,排除冠军就是亚军了res[1] = indexs[0] == res[0] ? indexs[1] : indexs[0];}indexs = newIndexs;}Integer[] lst4new = lst4.stream().filter(x -> x != res[0] && x != res[1]).toArray(Integer[]::new);//从4强里排除冠亚军,如果剩余1个,那么那一个就是季军,如果剩余2个,那么其中的较大值是季军。if (lst4new.length == 1 || lst4new[0] >= lst4new[1]) {res[2] = lst4new[0];} else {res[2] = lst4new[1];}return res;}
}
使用indexs来记录运动员的编号可能不太直观,可以考虑直接使用自定义对象来进行排序。如下:
package hwod;import java.util.*;
import java.util.stream.Collectors;public class Competition2 {private static List<CPlayer> wins = new ArrayList<>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();int[] res = competition(nums);for (int i = 0; i < res.length; i++) {if (i != 0) System.out.print(" ");System.out.print(res[i]);}}private static int[] competition(int[] nums) {int[] res = new int[3];for (int i = 0; i < nums.length; i++) {wins.add(new CPlayer(i, nums[i]));}List<CPlayer> lst4=new ArrayList<>();while (wins.size() > 2) {if (wins.size()==4||wins.size()==3) {lst4 = wins;}List<CPlayer> tmpList = new ArrayList<>();for (int i = 0; i < wins.size(); i += 2) {//>0,说明按照排序规则i该排在i+1后面,即i+1晋级if (i + 1 < wins.size() && wins.get(i).compareTo(wins.get(i + 1)) > 0) {tmpList.add(wins.get(i + 1));} else {tmpList.add(wins.get(i));}}wins = tmpList;}//最后剩下的wins一定是两个长度,产生冠亚军List<CPlayer> loser = lst4.stream().filter(x -> !wins.contains(x)).collect(Collectors.toList());Collections.sort(wins);Collections.sort(loser);res[0] = wins.get(0).getId();res[1] = wins.get(1).getId();res[2] = loser.get(0).getId();return res;}class CPlayer implements Comparable<CPlayer> {private int id;private long score;public int getId() {return id;}public void setId(int id) {this.id = id;}public long getScore() {return score;}public void setScore(long score) {this.score = score;}public CPlayer(int id, long score) {this.id = id;this.score = score;}@Overridepublic int compareTo(CPlayer o) {if (this.score == o.score) return this.id - o.id;return Long.compare(o.score, this.score);}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
相关文章:
【华为OD题库-031】比赛的冠亚季军-java
题目 有N(3<N<10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛&#…...
电脑如何禁止截屏
禁止电脑截屏是一项重要的安全措施,可以保护用户隐私和防止恶意软件的使用。以下是几种禁止电脑截屏的方法: 形式一: 一刀切,全部禁止截屏 可以在域之盾软件后,点击桌面管理,然后选择禁止截屏。就能禁止所…...
【Web】NewStarCTF Week1 个人复现
目录 ①泄露的秘密 ②Begin of Upload ③Begin of HTTP ④ErrorFlask ⑤Begin of PHP ⑥R!C!E! ⑦EasyLogin ①泄露的秘密 盲猜/robots.txt,访问得到flag前半部分 第二个没试出来,老老实实拿dirsearch扫吧 访问/www.zip 下载附件,拿到第二部分…...
Android 提示框代码 java语言
在Android中,你可以使用 AlertDialog 类来创建提示框。以下是一个简单的Java代码示例,演示如何创建和显示一个基本的提示框: import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; im…...
【c语言】二维数组的对角线对称交换
c语言,假设已经有了一个二维数组,对其进行对角线对称变换,如(0,1)与(1,0)变换,并打印。 示例 #include <stdio.h>void swap(int *a, int *b) {int te…...
Sulfo-CY3 NHS荧光染料的制备和表征
Sulfo-CY3 NHS(源自星戈瑞的花菁染料)荧光染料的制备和表征是确保染料质量和性能的关键步骤。制备Sulfo-CY3 NHS荧光染料: 原材料准备:准备所需的原材料,包括CY3 NHS ester(或等效的前体),用于制备Sulfo-C…...
数字乡村:科技赋能农村产业升级
数字乡村:科技赋能农村产业升级 数字乡村是指通过信息技术和数字化手段,推动农业现代化、农村经济发展和农民增收的一种新模式。近年来,随着互联网技术的飞速发展,数字乡村开始在全国范围内迅速兴起,为乡村经济注入了新…...
K8S部署mongodb-sharded-cluster(7.0.2)副本分片
添加源 helm repo add bitnami https://charts.bitnami.com/bitnami指定版本拉取 helm pull --repo https://charts.bitnami.com/bitnami mongodb-sharded --version 7.0.5安装时选择SCRAM-SHA-1默认是SCRAM-SHA-256 helm install -n prod mymongodb mongodb-sharded --value…...
Dockerfile-CentOS7.9+Python3.11.2
本文为CentOS7.9下安装Python3.11.2环境的Dockerfile # CentOS with Python3.11.2 # Author xxmail.com# build a new image with basic centos FROM centos:centos7.9.2009 # who is the author MAINTAINER xxmail.comRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/…...
自定义责任链Filter实现
核心接口 Filter package com.xxx.arch.mw.nbp.common.extension;import com.xxx.commons.data.domain.Result;/*** date 2023/08/25*/ public interface Filter {Result invoke(final Invoker invoker, final Invocation invocation); } Invoker package com.xxx.arch.mw.…...
NX二次开发UF_CSYS_create_matrix 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_matrix Defined in: uf_csys.h int UF_CSYS_create_matrix(const double matrix_values [ 9 ] , tag_t * matrix_id ) overview 概述 Creates a 3 x 3 matrix. 创建…...
css引入的三种方式
css引入的三种方式 一、内联样式二、外部样式表三、 内部样式表总结trouble 一、内联样式 内联样式也被称为行内样式。它是将 CSS 样式直接应用于 HTML 元素的 style 属性中的一种方式 <p style"color: blue; font-size: 16px;">这是一个带有内联样式的段落。&…...
含羞草研究所研究含羞草的代码
点击进入 一个简单的Python代码示例,用于模拟含羞草的行为: class Mimosa: def __init__(self): self.leaves_open True def touch_leaf(self): if self.leaves_open: print("Leaf closes due to touch.") self.leaves_open False else: p…...
常见立体几何图形的体积
文章目录 abstract祖暅原理推论 棱锥和圆锥的体积用积分的方法推导棱台和圆台的体积圆台体积公式 球体的体积球体的表面积 abstract 锥体和球体的体积公式主要通过积分的方法推导 这类公式的推导中学一般不要求,只要会应用公式在高等数学中由合适和方便的工具来推导这些公式而…...
vue3 + vue-router + keep-alive缓存页面
1.vue-router中增加mate.keepAlive和deepth属性 {path: /,name: home,component: HomeView,meta: {// 当前页面要不要缓存keepAlive: false,// 当前页面层级deepth: 1,}},{path: /list,name: list,component: ListView,meta: {// 当前页面要不要缓存keepAlive: true,// 当前页…...
unigui同页面内重定向跳转,企业微信内部应用开发获取用户code例子
procedure TMainForm.UniFormCreate(Sender: TObject); varurl: string;code: string; begin //如果没有code值,将进行重定向if UniApplication.Parameters.Values[code] thenbeginurl :https://open.weixin.qq.com/connect/oauth2/authorize?appid你们的企业ID&…...
垃圾数据啊
const arr [] //定义空数组 for (const key in this.fgkSyData) { //循环 this。sgksudata 数据arr.push( //push添加到 arr { [key]:this.fgkSyData[key] } //{} 在对象中 重新 定义key value 转换成对象) } console.log(arr, arr) …...
GB/T 29498-2013 木门窗检测
木门窗是指以木材、木质复合材料为主要材料制作框和扇的门窗。 GB/T 29498-2013 木门窗检测项目 测试项目 测试标准 外观质量 GB/T 29498 尺寸 GB/T 29498 装配质量 GB/T 29498 含水率 GB/T 17657 附着力 GB/T 4893.4 外门窗耐冷热循环 GB/T 4893.7 耐划痕 GB/…...
rocketMQ5.0顺序消息golang接入
本人理解,顺序消息如果不分消息组,那么会影响并行处理速度,所以尽量消息组分的散一些 首先上要求,官方文档如下: 总结: 1.必须同一个消息组,消息组和消费组不是一个概念,不要混 2.必…...
HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)
准备数据集 使用编码工具 首先需要加载编码工具,编码工具可以将抽象的文字转成数字,便于神经网络后续的处理,其代码如下: # 定义数据集 from transformers import BertTokenizer, BertModel, AdamW # 加载tokenizer token Ber…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
