华为OD机试 - 最大社交距离(Java 2024 C卷 100分)

在这里插入图片描述

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

疫情期间需要大家保证一定的社交距离,公司组织开交流会议。

座位一排共 N 个座位,编号分别为 [0, N - 1] , 要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。

满足:

  • 每当一个员工进入时,需要坐到最大社交距离(最大化自己和其他人的距离的座位);
  • 如果有多个这样的座位,则坐到 索引最小 的那个座位。

二、输入描述

  • 会议室座位总数 seatNum 。(1 <= seatNum <= 500)
  • 员工的进出顺序 seatOrLeave 数组,元素值为 1,表示进场;元素值为负数,表示出场(特殊:位置 0 的员工不会离开)。
  • 例如 - 4 表示坐在位置 4 的员工离开(保证有员工坐在该座位上)

三、输出描述

最后进来员工,他会坐在第几个位置,如果位置已满,则输出 - 1 。

1、输入

10
[1,1,1,1,-4,1]

2、输出

5

3、说明

核心思想:每当一个员工进入时,需要坐到最大社交距离。

0 0 0 0 0 0 0 0 0 0

  1. 第一次坐在了0的位置;1 0 0 0 0 0 0 0 0 0
  2. 第二次坐在了9的位置;1 0 0 0 0 0 0 0 0 1
  3. 第三次坐在了4的位置;1 0 0 0 1 0 0 0 0 1
  4. 第四次坐在了2的位置;1 0 1 0 1 0 0 0 0 1
  5. 第五次4离开了;1 0 1 0 0 0 0 0 0 1
  6. 第六次坐在了5的位置;1 0 1 0 0 1 0 0 0 1

四、解题思路

题目要求:每当一个员工进入时,需要坐到最大社交距离。

核心解题思路:

  1. 找到距离最远的两个1;
  2. 求其中间值,如果有两个,则取索引小的。

  1. 0表示无人坐,1表示有人坐;
  2. 第一个人坐在0的位置,第二个人坐在离0最远的的n-1位置;
  3. 两头都有人坐了,则找到距离最远的两个1,求其中间值,如果有两个,则取索引小的;
  4. 通过遍历已经坐过的位置sitArr,获取两个1的最远距离;
  5. 再通过折半取值,获取中间值;

五、Java算法源码

public class Test02 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.valueOf(sc.nextLine());int[] seatArr = new int[n];String input = sc.nextLine();int[] arr = Arrays.stream(input.substring(1, input.length() - 1).split(",")).mapToInt(Integer::parseInt).toArray();int ans = findDistantSeat(arr, n);System.out.print(ans);}/*** 1、找到距离最远的两个1* 2、求其中间值,如果有两个,则取索引小的*/public static int findDistantSeat(int[] arr, int n) {// 已经坐人的位置TreeSet<Integer> treeSet = new TreeSet<>();for (int i = 0; i < arr.length; i++) {// 特殊情况,如果只有1个位置,则返回0if (arr.length == 1) {return 0;} else if (arr.length == 2) {// 如果只有2个位置,则返回1return n - 1;}// 元素值为负数,表示出场if (arr[i] < 0) {treeSet.remove(-arr[i]);continue;}int size = treeSet.size();// 已经坐人的位置为0,则表示无人坐,第一个人坐在0的位置if (size == 0) {treeSet.add(0);} else if (size == 1) { // 已经坐人的位置为1,则表示0处有人,第二个人坐在离0最远的的n-1位置treeSet.add(n - 1);} else if (size > 1 && size < n) {// 两头都有人坐了,则找到距离最远的两个1,求其中间值,如果有两个,则取索引小的// 已经坐过的位置int[] sitArr = new int[size];int count = 0;for (Integer seatedNum : treeSet) {sitArr[count++] = seatedNum;}// 两个1的最远距离int max = 0;int left = 0;for (int j = 0; j < sitArr.length - 1; j++) {  // 计算最远距离int distance = sitArr[j + 1] - sitArr[j];// 获取两个1的最远距离if (distance / 2 > max) {max = distance / 2;left = sitArr[j];}}// 已经坐人的位置+1treeSet.add(left + max);if (i == arr.length - 1) {return left + max;}} else if (size == n) {// 如果位置已满,则输出 - 1return -1;}}// 异常情况返回-1return -1;}
}

六、效果展示

1、输入

12
[1,1,1,1,1,-2,-5,1]

2、输出

4

3、说明

  1. 第1次坐在了0的位置;1 0 0 0 0 0 0 0 0 0 0 0
  2. 第2次坐在了11的位置;1 0 0 0 0 0 0 0 0 0 0 1
  3. 第3次坐在了5的位置;1 0 0 0 0 1 0 0 0 0 0 1
  4. 第4次坐在了8的位置;1 0 0 0 0 1 0 0 1 0 0 1
  5. 第5次坐在了2的位置;1 0 1 0 0 1 0 0 1 0 0 1
  6. 第6次2离开了;1 0 1 0 0 1 0 0 1 0 0 1
  7. 第7次5离开了;1 0 0 0 0 0 0 0 1 0 0 1
  8. 第8次坐在了4的位置;1 0 0 0 1 0 0 0 1 0 0 1

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

基于 java + Springboot + vue +mysql 大学生实习管理系统(含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;实习管理系统的特点 &#x1f4d1;使用架构 &#x1f4da; 总体设计 &#x1f4da; 数据库设计 &#x1f4ac; 系统公告实体属性 &#x1f4ac; 单位成绩实体属性 &#x1f4ac; 学生实体属性 &#x1f4da; 系…

超市销售数据-python数据分析项目

Python数据分析项目-基于Python的销售数据分析项目 文章目录 Python数据分析项目-基于Python的销售数据分析项目项目介绍数据分析结果导出数据查阅 数据分析内容哪些类别比较畅销?哪些商品比较畅销?不同门店的销售额占比哪个时间段是超市的客流高封期?查看源数据类型计算本月…

10.图像高斯滤波的原理与FPGA实现思路

1.概念 高斯分布 图像滤波之高斯滤波介绍 图像处理算法|高斯滤波   高斯滤波(Gaussian filter)包含很多种&#xff0c;包括低通、高通、带通等&#xff0c;在图像上说的高斯滤波通常是指的高斯模糊(Gaussian Blur)&#xff0c;是一种高斯低通滤波。通常这个算法也可以用来模…

02 - 全加器和加法器

---- 整理自B站UP主 踌躇月光 的视频 1. 全加器 用门电路实现两个二进制数相加并求出和的组合线路&#xff0c;称为一位全加器。一位全加器可以处理低位进位&#xff0c;并输出本位加法进位。全加器比半加器多了一位进位。 1.1 实验 1&#xff1a;通过两个半加器设计全加器 1.…

【游戏漏洞】逆向基础之进制

本文给大家讲解我们日后逆向学习和实践过程中息息相关的一些重要基础 我们要讲解的是 例如 111在什么时候是正确的&#xff1f; OD&#xff0c;CE&#xff0c;IDA等工具为什么都是16进制&#xff1f; 计算机只认识0和1&#xff0c;也就2进制。 我们现实生活中常用到的是10进…

【LeetCode热题100】79. 单词搜索(回溯)

一.题目要求 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

Vue3+Vite Nginx部署 跨域

打包项目 webstorm打开项目之后&#xff0c;在Terminal执行打包命令 pnpm run build:prod 复制到Nginx 打包完成之后,生成的包在根目录dist&#xff0c;把dist目录拷贝到Nginx放网站目录下&#xff1a;\nginx-1.25.2\html\divided &#xff0c;dist改名了divided 修改配置…

Runes 生态一周要览 ▣ 2024.3.25-3.31|Runes 协议更新 BTC 减半在即

Runes 生态大事摘要 1、Casey 发布了 Runes 协议文档 RUNES HAVE DOCS&#xff0c;Github 代码库更新到 ord 0.17.0 版本&#xff0c;Casey 表示符文是一个“严肃”的代币协议。 2、Casey 公布了第一个硬编码的创世符文「UNCOMMONGOODS」 3、4月7日香港沙龙&#xff5c;聚焦「…

1,static 关键字.Java

目录 1.概述 2.定义格式和使用 2.1 静态变量及其访问 2.2 实例变量及其访问 2.3 静态方法及其访问 2.4 实例方法及其访问 3.小结 1.概述 static表示静态&#xff0c;是Java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。被static修饰后的&#xff…

小明的背包-dp_python

用户登录 动态规划的思想是自底向上&#xff0c;先求局部最优解然后求全局最优解。 dp[i][j]代表的是当前状态物品的数量以及背包的容量。 N, V map(int,input().split()) dp [[0 for _ in range(V1)] for _ in range(N1)]for i in range(1,N1):v, w map(int,input().split(…

算法学习17:背包问题(动态规划)

算法学习17&#xff1a;背包问题&#xff08;动态规划&#xff09; 文章目录 算法学习17&#xff1a;背包问题&#xff08;动态规划&#xff09;前言一、01背包问题&#xff1a;1.朴素版&#xff1a;&#xff08;二维&#xff09;2.优化版&#xff1a;&#xff08;一维&#xf…

Qt实现Kermit协议(三)

3 实现 3.2 KermitSendFile 该模块实现了Kermit发送文件功能。 序列图如下&#xff1a; 3.2.1 KermitSendFile定义 class QSerialPort; class KermitSendFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitSendFile(QSerialPort *serial, QObject *…