选座位
题目
疫情期间需要大家保证一定的社交距离
公司组织开交流会议,座位有一排共N
个座位
编号分别为[0...n-1]
要求员工一个接着一个进入会议室
并且还可以在任何时候离开会议室
每当一个员工进入时,需要坐到最大社交距离的座位
- 例如:
- 位置
A
与左右有员工落座的位置距离分别为2
和2
- 位置
B
与左右有员工落座的位置距离分别为2
和3
- 影响因素都为两个位置,则认为作为
A
和B
与左右位置的社交距离是一样的 - 如果有多个这样的座位
- 则坐到索引最小的那个座位
- 位置
输入
会议室座位总数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 的的距离为(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
`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