华为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个位置,则返回0
            if (arr.length == 1) {
                return 0;
            } else if (arr.length == 2) {// 如果只有2个位置,则返回1
                return 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];
                    }
                }

                // 已经坐人的位置+1
                treeSet.add(left + max);
                if (i == arr.length - 1) {
                    return left + max;
                }
            } else if (size == n) {// 如果位置已满,则输出 - 1
                return -1;
            }
        }
        // 异常情况返回-1
        return -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在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

央视315推荐的护眼灯有哪些?护眼灯十大品牌推荐

台灯作为家居类不可或缺的一种照明灯具&#xff0c;在我们的日常生活中发挥着重要作用&#xff0c;尤其是对于经常需要在夜晚长时间用眼学习的孩子而言&#xff0c;能够提供充足、明亮的照明&#xff0c;对学习帮助是非常大的。然而台灯的选择也是有讲究的&#xff0c;市面上很…

MongoDB 6.1 及以上版本使用配置文件的方式启动报错 Unrecognized option: storage.journal.enabled

如果你使用的 MongoDB 的版本大于等于 6.1&#xff0c;并且在 MongoDB 的配置文件中编写了如下内容 storage:journal:# 启用或禁用持久性日志以确保数据文件保持有效和可恢复# true 启用&#xff1b;false 不启用# 64 位系统默认启用&#xff0c;启用后 MongoDB 可以在宕机后根…

黄金票据的复现

实验环境以及工具 服务器&#xff1a;Windows server 2003 用户&#xff1a;Windows 7旗舰版 工具&#xff1a;mimikatz 搭建服务器环境 参考&#xff1a;内网横向——域渗透之黄金票据复现-CSDN博客 创建用户 使用gpupdate刷新策略&#xff1b; 搭建win7环境 设置ip ‘…

SpringBoot实现邮箱验证

目录 1、开启邮箱IMAP/SMTP服务&#xff0c;获取授权码 2、相关代码 1、使用配置Redis&#xff08;用于存储验证码&#xff0c;具有时效性&#xff09; 2、邮箱依赖和hutool&#xff08;用于随机生成验证码&#xff09; 3、配置Redis和邮箱信息 4、开启Redis服务 5、编写发送…

天诚人脸物联网锁搭载智慧公寓管理系统,赋能公寓智慧租住与通行管理

随着我国各大城市大规模地更新进程&#xff0c;各地掀起了人才公寓、地产品牌公寓、长短租公寓建设的浪潮&#xff0c;城中村改造也成为各地热门的民生话题。全场景AIoT解决方案服务商——江苏新巢天诚智能技术有限公司&#xff08;以下简称“天诚”&#xff09;从社区居民“租…

耐腐蚀耐高温实验室塑料烧杯进口高纯PFA材质反应器特氟龙烧杯

PFA烧杯在实验过程中可作为储酸容器或涉及强酸强碱类实验的反应容器&#xff0c;用于盛放样品、试剂&#xff0c;可搭配电热板加热、蒸煮、赶酸用。 外壁均有凸起刻度&#xff0c;直筒设计&#xff0c;带翻边&#xff0c;便于夹持和移动&#xff0c;边沿有嘴&#xff0c;便于倾…

nvm的使用

需求&#xff1a;不同项目使用的是不同版本的node版本 思路&#xff1a;可以使用nvm来管理和实现不同版本的切换使用 1.nvm的使用环境 如果电脑之前安装有node需要卸载node&#xff0c;并把yarn的环境变量删除&#xff08;没有可以省略这一步&#xff09; 2.nvm的下载及安装…

C-偶遇行军蚁(遇到过的题,做个笔记)

我的代码: 思路就是把每一行看成一个字符串&#xff0c;然后逐渐增加字符就行 #include <iostream> #include <vector> using namespace std; int main() {string s;int n;cin >> n; //读入行数cin >> s; //读入字符串vector<string>arr(n…

LeetCode 209 长度最小的子数组(滑动窗口,双指针实现)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

工具推荐:简单好用的企业知识管理SaaS产品合集

在这个信息爆炸的时代&#xff0c;企业的每位员工都在每天处理大量的信息与知识&#xff0c;如果没有合适的工具来管理这些宝贵资源&#xff0c;很容易造成知识的流失或重复劳动。幸好&#xff0c;现在有了很多知识管理SaaS&#xff08;即服务软件&#xff09;产品可以帮助我们…

深信服超融合虚拟机的导入方法

以从vmware虚拟机导出的虚拟机为例。 1 进入虚拟机页面点【新增】&#xff0c;选择【导入虚拟机】 2 以文件类型为ovf、mf、vmdk为例导入 选择文件类型&#xff0c;选择那三个导出的虚拟机的文件&#xff0c;选择分组&#xff0c;存储位置和运行位置默认&#xff0c;操作系统…

Android 自定义View 测量控件宽高、自定义viewgroup测量

1、View生命周期以及View层级 1.1、View生命周期 View的主要生命周期如下所示&#xff0c; 包括创建、测量&#xff08;onMeasure&#xff09;、布局&#xff08;onLayout&#xff09;、绘制&#xff08;onDraw&#xff09;以及销毁等流程。 自定义View主要涉及到onMeasure、…

Matlab实验:IIR数字滤波器设计

01.实验内容及原理 02.代码效果图 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复&#xff1a;MATLAB实验本公众号致力于解决找代码难&#xff0c;写代码怵。各位有什么急需的代码&#xff0c;欢迎后台留言~不定时更新科…

人人都离不开的算法:AI 时代的生存指南

文章目录 一、算法在生活中的“无处不在”二、算法在工作学习中的“智慧助力”三、算法在社会发展中的“驱动力量”四、算法带来的“双刃剑”效应五、应对算法挑战的策略《人人都离不开的算法——图解算法应用》编辑推荐1、通俗易懂2、技术科普3、贴近时代、贴近生活4、启发思考…

企业微信知识库的搭建方法都在这里了,赶紧收藏!

如果你是一位希望在企业内部实现高效知识共享和管理的管理者&#xff0c;搭建一个企业微信知识库可能是你最佳的选择之一。在这篇文章中&#xff0c;我将以简单明了的方式向大家介绍如何在企业微信上搭建和管理一个知识库。 首先&#xff0c;让我们了解一下什么是企业微信知识库…

学成在线_统一账号密码认证_http测试报错500

问题 在进行统一账号密码认证的http测试时报错500&#xff0c;如下图所示 问题原因 由于我们期待的账号和密码认证是通过userDetailsService对象来实现的&#xff0c;所以当我们将userDetailsService对象注入DaoAuthenticationProviderCustom类后需要屏蔽原本的密码比对。 …

深信服:借助观测云实现全链路可观测性

导读 深信服科技股份有限公司 简称「深信服」&#xff08; Sangfor Technologies Inc. &#xff09;&#xff0c;是一家领先的网络安全和云计算解决方案提供商&#xff0c;致力于为全球客户提供高效、智能、安全的网络和云服务。随着公司业务的不断扩展&#xff0c;也面临着监…

WIFI驱动移植实验:WIFI从路由器动态获取IP地址与联网

一. 简介 前面两篇文章&#xff0c;一篇文章实现了WIFI联网前要做的工作&#xff0c;另一篇文章配置了WIFI配置文件&#xff0c;进行了WIFI热点的连接。文章如下&#xff1a; WIFI驱动移植实验&#xff1a;WIFI 联网前的工作-CSDN博客 WIFI驱动移植实验&#xff1a;连接WIF…

如何正确选购和安装可燃气体探测器?全方位指导手册

一、可燃气体探测器概述 可燃气体探测器是一种用于监测环境中可燃气体浓度的安全设备。这种探测器能够精确感知空气中的气体变化&#xff0c;一旦检测到可燃气体浓度超过预设的安全阈值&#xff0c;就会迅速触发报警系统&#xff0c;发出声光警报&#xff0c;以提醒人员及时采…

vue3+ts 调用接口,数据显示

数据展示 &#xff08;例&#xff1a;展示医院等级数据&#xff0c;展示医院区域数据同理。&#xff09; 接口文档中&#xff0c;输入参数 测试一下接口&#xff0c;发请求 看是否能够拿到信息 获取接口&#xff0c;api/index.ts 中 /home/index.ts // 统一管理首页模块接口 i…