选座位 - 华为OD统一考试(C卷)

news2025/1/17 15:38:41

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0…N-1],要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。

满足:每当一个员工进入时,需要坐到最大社交距离的座位(例如:位置A与左右有员工落座的位置距离分别为2和2,位置B与左右有员工落座的位置距离分别为2和3,影响因素都为2个位置,则认为座位A和B与左右位置的社交距离是一样的),如果有多个这样的座位,则坐到索引最小的那个座位。

输入描述

会议室座位总数seatNum,(1 <= seatNum <= 500) 员工的进出顺序 seatOrLeave数组,元素值为1: 表示进场,元素值为负数,表示出场(特殊:位置0的员工不会离开)。

例如-4表示坐在位置4的员工离开 (保证有员工坐在该座位上)。

输出描述

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

示例1

输入:
10
[1, 1, 1, 1, -4, 1]

输出:
5

说明:
seat ->0,坐在任何位置都行,但是要给他安排索引最小的位置,也就是座位0。
seat ->9, 要和旁边的人距离最远,也就是座位9。
seat ->4,位置4与0和9的距离为(4和5),位置5与0和9的距离(5和4),所以位置4和5都是可以选择的座位,按照要求需索引最小的那个座位,也就是座位4。
seat ->2,位置2与0和4的距离为(2和2),位置6与4和9的距离(2和3),位置7与4和9的距离(3和2),影响因素都为2个位置,按照要求需索引最小的那个座位,也就是座位2。leave(4),4号座位的员工离开。
seat-> 5,员工最后坐在5号座位上。

此题为非ACM模式,只需要实现 conferenceSeatDistance 方法即可。

题解

这是一个模拟会议室座位安排的问题,需要根据特定规则安排员工的座位。

  1. 使用有序 Set 来维护已经被坐的座位情况(java 代码使用 TreeSet )。并通过插入两个虚拟的座位作为边界来方便计算最大社交距离的座位。
  2. 进入会议室的算法: 使用join方法来计算员工进入会议室时的最佳座位。通过遍历 TreeSet 中相邻的位置,计算中间座位的社交距离,找到最大距离的座位,并插入到 TreeSet 中。
  3. 座位计算: 在主方法中,遍历员工的进出顺序,根据不同情况调用join方法或者从TreeSet中移除座位。
  4. 输出: 输出最后一个员工坐的位置。

Java

import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int seatNum = sc.nextInt();
        sc.nextLine();
        String seatOrLeaveLine = sc.nextLine();
        String[] c = seatOrLeaveLine.substring(1, seatOrLeaveLine.length() - 1).split(", ");
        int[] seatOrLeave = new int[c.length];
        for (int i = 0; i < c.length; i++) {
            seatOrLeave[i] = Integer.parseInt(c[i]);
        }

        Main socialDistance = new Main();
        int ans = socialDistance.conferenceSeatDistance(seatNum, seatOrLeave);
        System.out.println(ans);
    }

    /**
     * 计算最后进来的人,坐的位置
     *
     * @param seatNum     会议室座位总数
     * @param seatOrLeave 员工的进出顺序
     * @return 最后进来的人,坐的位置
     */
    public int conferenceSeatDistance(int seatNum, int[] seatOrLeave) {
        TreeSet<Integer> seatTree = new TreeSet<>();
        // 插入两个虚拟的座位,有了这两个个边界方便计算最大社交距离的座位
        seatTree.add(-2 * (seatNum - 1));
        seatTree.add(2 * (seatNum - 1));

        int last = -1;
        for (int t : seatOrLeave) {
            if (t == 1) { // 进来
                last = join(seatTree, seatNum);
            } else { // 座位 -t 的人离开
                seatTree.remove(-t);
            }
        }

        return last;
    }

    /**
     * 计算员工进行会议该做的位置
     *
     * @param seatTree 已经被坐的座位情况
     * @param N        会议室座位个数
     * @return -1 没有合适的位置可坐
     */
    public int join(TreeSet<Integer> seatTree, int N) {
        // 最大的社交距离
        int maxDistance = 0, idx = -1;

        // 根据 TreeSet key 的有序性,遍历所有相邻的位置看中间的座位是否是会议室中社交距离最大的座位
        Iterator<Integer> it = seatTree.iterator();
        int pre = it.next();
        while (it.hasNext()) {
            int cur = it.next();
            int distance = (cur - pre) / 2;

            // 判断在 pre 和 cur 中间坐社交距离是否更大 
            if (distance > maxDistance) {
                // 坐在 pre 和 pre  中间的位置(索引最小的)
                int pos = (cur + pre) / 2;
                // 当前 pos 是有效的可坐位置
                if (0 <= pos && pos < N) {
                    idx = pos;
                    maxDistance = distance;
                }
            }
            pre = cur;
        }

        // 找到了合适的座位,则坐在 idx 位置上
        if (idx != -1) seatTree.add(idx);

        return idx;
    }
}

Python

from itertools import pairwise


class Solution:
    def conference_seat_distance(self, seat_num, seat_or_leave):
        # 记录座位情况
        self.seat_list = [-2 * (seat_num - 1), 2 * (seat_num - 1)]
        last = -1
        for t in seat_or_leave:
            if t == 1:  # 进来
                last = self.join(seat_num)
            else:  # 座位 -t 的人离开
                self.seat_list.remove(-t)

        return last

    def join(self, N):
        max_distance, idx = 0, -1

        # 遍历所有相邻的位置看中间的座位是否是会议室中社交距离最大的座位
        for pre, cur in pairwise(self.seat_list):
            distance = (cur - pre) // 2

            # 判断在 pre 和 cur 中间坐社交距离是否更大
            if distance > max_distance:
                # 坐在 pre 和 pre  中间的位置(索引最小的)
                pos = (cur + pre) // 2
                # 当前 pos 是有效的可坐位置
                if 0 <= pos < N:
                    idx = pos
                    max_distance = distance

        # 找到了合适的座位,则坐在 idx 位置上
        if idx != -1:
            self.seat_list.append(idx)
            self.seat_list.sort()

        return idx


solution = Solution()
last = solution.conference_seat_distance(10, [1, 1, 1, 1, -4, 1])
print(last)

C++

#include <iostream>
#include <vector>
#include <set>

using namespace std;

class Solution {
public:
    int conferenceSeatDistance(int seatNum, vector<int>& seatOrLeave) {
        set<int> seatTree;
        seatTree.insert(-2 * (seatNum - 1));
        seatTree.insert(2 * (seatNum - 1));

        int last = -1;
        for (int t : seatOrLeave) {
            if (t == 1) {
                last = join(seatTree, seatNum);
            } else {
                seatTree.erase(-t);
            }
        }

        return last;
    }

    int join(set<int>& seatTree, int N) {
        int maxDistance = 0, idx = -1;
        auto it = seatTree.begin();
        int pre = *it++;

        while (it != seatTree.end()) {
            int cur = *it++;
            int distance = (cur - pre) / 2;

            if (distance > maxDistance) {
                int pos = (cur + pre) / 2;
                if (pos >= 0 && pos < N) {
                    idx = pos;
                    maxDistance = distance;
                }
            }
            pre = cur;
        }

        if (idx != -1) seatTree.insert(idx);

        return idx;
    }
};

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mvn版本导致的Failed to execute goal on project问题与解决

目录 一&#xff0c;报错情况与原因二&#xff0c;maven的下载与安装1&#xff0c;卸载maven2&#xff0c;安装mvn3&#xff0c;指定mvn的默认版本&#xff1a; 一&#xff0c;报错情况与原因 使用命令mvn package时会报如下错误&#xff1a; Failed to execute goal on proj…

关于js [GDOUCTF 2023]hate eat snake

查看页面源代码 发现snake.js文件 打开js文件 第7行定义了游戏的速度this.speed this.oldSpeed speed || 10 ; 全文搜索speed&#xff0c;在第237行发现自增代码this.speed; 注释或者删除自增代码 回到游戏页面 重玩游戏&#xff0c;等待60s即可 得到flag

C语言--贪吃蛇

目录 1. 实现目标2. 需掌握的技术3. Win32 API介绍控制台程序控制台屏幕上的坐标COORDGetStdHandleGetConsoleCursorinfoCONSOLE_CURSOR_INFOSetConsoleCursorInfoSetConsoleCursorPositionGetAsyncKeyState 4. 贪吃蛇游戏设计与分析地图<locale.h>本地化类项setlocale函…

matlab经验模式分解的R波检测算法

1、内容简介 略 56-可以交流、咨询、答疑 2、内容说明 略 心血管疾病是威胁人类生命的主要疾病之一&#xff0c;而心电信号&#xff08;electrocardiogram, ECG&#xff09; 则是评价心脏功能的主要依据&#xff0c;因此&#xff0c;关于心电信号检测处理的研究一直为各方所…

js设计模式:状态模式

作用: 将对象的行为和状态进行分离,状态是由行为操作决定的,而不是直接控制。 同时,行为也是由状态决定的,每个状态都有自己的行为和相应的方法 行为与状态分离,可以使代码方便维护 示例: <!DOCTYPE html> <html lang"en"><head><meta cha…

基于YOLOv5+PySide6的火灾火情火焰检测系统设计深度学习

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225火灾 获取完整源码源文件已标注的数据集&#xff08;1553张&#xff09;配置跑起来说明 可有偿49yuan一对一远程操作&#xff0c;在你电脑跑起来 效果展示&#xff1a; ​数据集在下载的文件夹&#xff1a;yolov5-5.0\…

Vue3中的select 的option是多余的?

背景&#xff1a; 通过Vue3中填充一个下拉框&#xff0c;在打开页面时要指定默认选中&#xff0c;并在选项改变时把下拉框的选中值显示出来 问题&#xff1a; 填充通常的作法是设置 <option v-for"option in cities" :value"option.value" >&a…

软件测试中的测试左移与测试右移

在软件开发的过程中&#xff0c;测试是确保软件质量的一个至关重要的环节。随着软件开发方法的不断演进&#xff0c;测试也在不断地发展和改进。其中&#xff0c;测试左移&#xff08;Shift Left Testing&#xff09;和测试右移&#xff08;Shift Right Testing&#xff09;是两…

QlikSense CyberSecurity : Configuring preferred Cipher Suites

You can rank the preferred cipher suites that Qlik License Service uses to encrypt and decrypt the signed key license.您可以对Qlik许可证服务用于加密和解密签名密钥许可证的首选密码套件进行排序。 The Qlik License Service is included in Qlik Sense Enterprise …

【微服务生态】Dubbo

文章目录 一、概述二、Dubbo环境搭建-docker版三、Dubbo配置四、高可用4.1 zookeeper宕机与dubbo直连4.2 负载均衡 五、服务限流、服务降级、服务容错六、Dubbo 对比 OpenFeign 一、概述 Dubbo 是一款高性能、轻量级的开源Java RPC框架&#xff0c;它提供了三大核心能力&#…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…

2024年5月软考考试时间及考试安排

2024年5月软考考试时间&#xff1a;为5月25日到28日 考试采取科目连考、分批次考试的方式,连考的第一个科目作答结束交卷完成后自动进入第二个科目&#xff0c;第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a;综合知识科目考试时长150分钟&#xff0c;最短作…

代码随想录第41天|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

文章目录 背包问题背包题目解法一 ● 01背包问题-二维数组五部曲1.确定dp数组2、确定递推公式3、初始化dp数组4、循环代码&#xff1a; 解法二-01背包问题-滚动数组五部曲1&#xff1a;定义dp二、递推公式三、初始化四、循环顺序代码&#xff1a; 698. 划分为k个相等的子集题解…

Mysql5.7主从复制搭建

注意不适用Mysql8 Docker搭建Mysql主从复制 docker run -p 3307:3306 --name mysql-master \ -v /usr/local/develop/mysql-master/log:/var/log/mysql \ -v /usr/local/develop/mysql-master/data:/var/lib/mysql \ -v /usr/local/develop/mysql-master/conf:/etc/mysql/con…

开源工具和框架

目录 开源工具和框架 一、 开源工具和框架 二、开源工具和框架在现代软件开发中的角色 1、基础设施建设&#xff1a; 2、开发效率提升&#xff1a; 3、代码质量保障&#xff1a; 4、技术创新&#xff1a; 三、广泛使用的开源项目分析 3.1、Linux 3.2、Git 3.3、Docke…

高等数学(无穷小与无穷大)

目录 一、无穷小 二、无穷大 三、无穷小与无穷大的关系 四、无穷小量的阶的比较 一、无穷小 二、无穷大 三、无穷小与无穷大的关系 四、无穷小量的阶的比较

女生常用的社交app软件有哪些?分享女生用的最多的社交软件

随着科技的迅猛发展&#xff0c;社交软件也日益多样化。除了常见的社交平台&#xff0c;一些全新的社交软件如雨后春笋般涌现&#xff0c;为用户带来了更多元、更有趣的社交体验。这里为大家介绍 5 款女生用的最多的社交软件&#xff0c;它们分别是丛丛、青藤之恋、meetu、小奢…

12. Springboot集成Dubbo3(三)Dubbo-Admin

目录 1、前言 2、安装 2.1、下载Dubbo-admin 2.2、修改配置 2.3、编译前端 2.4、访问 2.5、加载自己的服务 2.6、服务测试 2.7、其他 3、小结 1、前言 Dubbo Admin是用于管理Dubbo服务的基于Web的管理工具。Dubbo Admin提供了一个用户友好的界面&#xff0c;用于在分…

进程 2月24日学习笔记

1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xff09; PID:唯一识…

番外篇 | YOLOv5+DeepSort实现行人目标跟踪检测

前言:Hello大家好,我是小哥谈。DeepSort是一种用于目标跟踪的深度学习算法。它结合了目标检测和目标跟踪的技术,能够在视频中准确地跟踪多个目标,并为每个目标分配一个唯一的ID。DeepSort的核心思想是将目标检测和目标跟踪两个任务进行联合训练,以提高跟踪的准确性和稳定性…