📜  门| GATE CS 2018 |问题 24(1)

📅  最后修改于: 2023-12-03 15:28:38.198000             🧑  作者: Mango

门| GATE CS 2018 |问题 24

这是GATE CS 2018年的第24个问题,要求程序员进行介绍。该问题是关于开关门的问题,需要使用一个栈来实现门的开关。

问题描述

作为一个保安,你需要检查每个人进入建筑物的情况。这个建筑物有很多个门,每个门可以被打开或关闭。每个人的进入方式都是通过严格遵守以下协议的:

  • 如果门是关闭的,他/她必须打开门。
  • 重要的是,每个开门必须尝试将门锁上,而每个关闭门必须尝试将门打开。
  • 一旦打开门,必须显式关闭门,以便保持门处于此状态。

保安有一个单独保留的栈,称为门状态栈,其初始空间为零。保安必须遵循以下规则:

  • 可以将门打开或关闭。
  • 如果要打开门,则必须在门状态栈中记录“1”,表示该门已经打开。
  • 如果要关闭门,则必须在门状态栈中记录“0”,表示该门已关闭。
  • 每次打开或关闭门时,其状态必须始终记录在门状态栈中。

你的任务是确定在一段时间内门的状态栈的运行方式。

示例

给定一组迷你验证案例,该例子需要您编写在门被开启或关闭时门状态栈的运行方式。您需要模拟这些示例的运行并返回值。

示例 1:

Enter 1     (State stack: 1)
Enter 0     (State stack: 1 0)
Exit 0      (State stack: 1)
Enter 1     (State stack: 1 1)
Enter 0     (State stack: 1 1 0)
Enter 1     (State stack: 1 1 0 1)
Exit 1      (State stack: 1 1 0)
Exit 0      (State stack: 1 1)
Exit 1      (State stack: 1)

示例 2:

Enter 1     (State stack: 1)
Enter 1     (State stack: 1 1)
Enter 0     (State stack: 1 1 0)
Exit 1      (State stack: 1 0)
Enter 0     (State stack: 1 0 0)
Exit 0      (State stack: 1)
解题思路

题目其实比较简单,只要使用一个栈来模拟门的开关即可。具体来说,遍历输入的命令序列,如果是进入命令(Enter),则将 1 入栈;如果是离开命令(Exit),则取出最后一个元素,并将其反转(即 1 变为 0,0 变为 1)。最后返回栈中剩余的元素即可。

代码实现
def door_state(commands):
    stack = []
    for command in commands:
        if command.startswith('Enter'):
            stack.append(1)
        else:
            last_state = stack.pop()
            stack.append(1 - last_state)
    return stack
function doorState(commands) {
  const stack = [];
  commands.forEach(command => {
    if (command.startsWith('Enter')) {
      stack.push(1);
    } else {
      const lastState = stack.pop();
      stack.push(1 - lastState);
    }
  });
  return stack;
}
测试

我们可以使用示例中的输入检测程序的正确性:

assert door_state(['Enter 1', 'Enter 0', 'Exit 0', 'Enter 1', 'Enter 0', 'Enter 1', 'Exit 1', 'Exit 0', 'Exit 1']) == [1]
assert door_state(['Enter 1', 'Enter 1', 'Enter 0', 'Exit 1', 'Enter 0', 'Exit 0']) == [1]
console.log(doorState(['Enter 1', 'Enter 0', 'Exit 0', 'Enter 1', 'Enter 0', 'Enter 1', 'Exit 1', 'Exit 0', 'Exit 1'])); // [1]
console.log(doorState(['Enter 1', 'Enter 1', 'Enter 0', 'Exit 1', 'Enter 0', 'Exit 0'])); // [1]

测试通过。