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

news/2024/7/20 17:42:15 标签: 华为od, java, 逻辑分析, 最大社交距离

在这里插入图片描述

华为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算法源码

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在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5467292.html

相关文章

Vue-Electron配置及踩坑

前言 大道至简。太复杂的教程不看。 本篇将记述我创建好Vue3项目之后&#xff0c;用Electron把页面呈现出来的整个过程。会记录一些踩坑。 首先&#xff0c;Electron官网可以参考。但是它只是作出了一个普通的html结构该如何用Electron呈现出来&#xff0c;vue的配置有一些变…

面试算法3/400-寻找右区间

题目 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。 区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > endi &#xff0c;且 startj 最小化 。注意 i 可能等于 j 。 返回一个由每个区…

优化选址问题 | 基于帝国企鹅算法求解工厂-中心-需求点三级选址问题含Matlab源码

目录 问题代码问题 "帝国企鹅算法"并不是一个广为人知的优化算法,可能是一个特定领域或者特定情境下提出的方法。不过,对于工厂-中心-需求点三级选址问题,它可能是一种启发式优化方法,用于在多个候选位置中选择最优的工厂、中心和需求点位置。 这类问题通常涉及…

2023年网络安全领域新兴技术的发展特点

文 | 中国信息安全测评中心 穆琳 2023 年&#xff0c;人类社会加速迈进数字时代&#xff0c;新兴技术与网络安全的关系愈发密切&#xff0c;为全球网络攻防带来更多不对称性和复杂性。人工智能、区块链、量子信息技术、第六代移动通信&#xff08;6G&#xff09;作为信息技术领…

大数据学习十二天(补hadoop基础1)

1、 分布式的基础架构分析[重要] 集群架构模式: 主从架构(中心化): 主角色 master: 发号施令,负责任务的接受和分配 从角色 slave: 负责干活 主备架构:可以解决中心化存在的问题 主角色active : 正常工作 备角色standby : 观察主角色工作,并实时备份主角色数据,当主角色宕机…

Java(内部类)

1.内部类 内的五大成员&#xff1a;属性、方法、构造方法、代码块、内部类 解释&#xff1a;在一个类的里面&#xff0c;再定义一个类。举例:在A类的内部定义B类&#xff0c;B类就被称为内部类注意&#xff1a;内部类表示的事物是外部类的一部分&#xff0c;内部类单独出现没…

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…

Stable Diffusion 本地化部署

一、安装 Python 1、到 Python 的官网进行下载最新版本的Python&#xff0c;当前最新是3.12.2 2、开始安装 安装成功 打开 cmd &#xff0c;输入 python&#xff0c;如果有以下提示&#xff0c;证明安装成功了&#xff1a;