题目5-python华为原题题库-选座位

选座位

题目

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

  • 例如:
    • 位置A与左右有员工落座的位置距离分别为22
    • 位置B与左右有员工落座的位置距离分别为23
    • 影响因素都为两个位置,则认为作为AB与左右位置的社交距离是一样的
    • 如果有多个这样的座位
    • 则坐到索引最小的那个座位

输入

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

输出

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

示例一

输入
10
[1,1,1,1,-4,1]
输出
5
说明
  • `seat->0`坐在任何位置都行
    但是要给他安排索引最小的位置,也就是座位0
  • `seat->9`要和旁边的人距离最远 也就是座位9
  • `seat->4`位置4,4与 0 和 9 的的距离为(45)
    位置50和 9 的距离为(54)
    所以位置45都是可选的座位
    按照要求需索引最小的 选择4
  • `seat->2 `位置204的距离位置为(22)
    位置649的距离位置为(23)
    位置749的距离位置为(32)
    影响因素都为两个位置按照要求需索引最小的座位
    所以座位2
  • `leave(4)` 4号座位员工离开
  • `seat->5` 员工最后坐在5号座位

编码思路

本题模拟了一堆人依次入座和离开座位的过程。在模拟的过程中,需要判断每个人能否入座或离开,并且要选择最优的座位。其中,如果座位已经坐满,则后面的人无法入座,直接输出 -1。

核心知识点

知识点比较简单,阅读代码即可。

Python 代码实现

import sys


def select_seat(seatNum, seatOrLeave):
    # 初始化已被占用的座位列表
    occupied_seats = [False] * seatNum
    max_seat_index = -1
    # 对于每个员工的进出情况,按顺序进行处理
    for i in seatOrLeave:
        if i > 0:  # 员工进入会议室
            if occupied_seats.count(True) == 0:
                occupied_seats[0] = True
                continue
            max_distance, max_seat_index = 0, -1
            # 遍历每个座位,计算与左右相邻座位的距离
            for j in range(seatNum):

                if not occupied_seats[j]:
                    # 计算左右最近座位的索引
                    left_seat_index = j - 1
                    while left_seat_index >= 0 and not occupied_seats[left_seat_index]:
                        left_seat_index -= 1
                    right_seat_index = j + 1
                    while right_seat_index < seatNum and not occupied_seats[right_seat_index]:
                        right_seat_index += 1

                    if right_seat_index == 10:
                        right_seat_index = sys.maxsize
                    if left_seat_index == -1:
                        left_seat_index = sys.maxsize
                    distance = min(j - left_seat_index, right_seat_index - j)
                    # 如果当前位置的距离大于等于最大距离,则更新最大距离和座位编号
                    if distance > max_distance:
                        max_distance, max_seat_index = distance, j
            # 如果没有找到合适的座位,则返回-1
            if max_seat_index == -1:
                return -1
            # 否则将该座位标记为已被占用
            # print(max_distance, max_seat_index)
            occupied_seats[max_seat_index] = True
        else:  # 员工离开会议室,释放座位
            occupied_seats[abs(i)] = False
    # 返回最后一个员工坐的座位编号
    return max_seat_index


seatNum = 10
seat_or_leave_input = [1, 1, 1, 1, -4, 1]
print(select_seat(seatNum, seat_or_leave_input))

代码运行结果

5
  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值