Amazon 面经|分享国际站面经(Amazon | OA | turnstile/旋转门)
2170
发布于 未知归属地

题目

image.png
image.png
image.png

题意简介

给出每个人到旋转门的时间和进出方向,按先后顺序进出,优先前一个时刻同方向的进出。

算法

  1. 建立两个队列,分别记录当前可以enter和leave的人;
  2. 按照时刻分组,当一个时刻的人全部读取完后;
  3. 贪心地把与前一个时刻同方向的全部处理
  4. 如果到下一个有人到达的时刻之间还有时间,则处理部分另一个方向的人
  5. 如果下一个时刻与当前最后时刻之间有间隙,需要重置preState为1(leave)

代码

# time = [0, 0, 1, 5]
# direction = [0, 1, 1, 0]

# time = [0, 0, 5, 5]
# direction = [0, 1, 1, 0]

time = [0, 1, 1, 3, 3]
direction = [0, 1, 0, 0, 1]

# time = [1, 2, 4]
# direction = [0, 1, 1]

# time = [1, 1, 3, 3, 4, 5, 6, 7, 7]
# direction = [1, 1, 0, 0, 0, 1, 1, 1, 1]

enter = deque()
leave = deque()
ans = [-1] * len(time)

preState = 1 # leave
lastUsed = -1 # last used time
cur = 0 # current time

for i, t in enumerate(time):
    if t > lastUsed + 1:
        preState = 1
        cur = t
        
    if direction[i] == 0:
        enter.append(i)
    else:
        leave.append(i)
        
    if i == len(time) - 1 or t != time[i+1]:
        if preState == 1:
            while leave:
                ans[leave.popleft()] = cur
                cur += 1
            while enter and (i == len(time) - 1 or cur < time[i+1]):
                ans[enter.popleft()] = cur
                cur += 1
                preState = 0
        elif preState == 0:
            while enter:
                ans[enter.popleft()] = cur
                cur += 1
            while leave and (i == len(time) - 1 or cur < time[i+1]):
                ans[leave.popleft()] = cur
                cur += 1
                preState = 1

        lastUsed = cur - 1

print(ans)
评论 (0)