📅  最后修改于: 2023-12-03 15:28:38.198000             🧑  作者: Mango
这是GATE CS 2018年的第24个问题,要求程序员进行介绍。该问题是关于开关门的问题,需要使用一个栈来实现门的开关。
作为一个保安,你需要检查每个人进入建筑物的情况。这个建筑物有很多个门,每个门可以被打开或关闭。每个人的进入方式都是通过严格遵守以下协议的:
保安有一个单独保留的栈,称为门状态栈,其初始空间为零。保安必须遵循以下规则:
你的任务是确定在一段时间内门的状态栈的运行方式。
给定一组迷你验证案例,该例子需要您编写在门被开启或关闭时门状态栈的运行方式。您需要模拟这些示例的运行并返回值。
示例 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]
测试通过。