Используйте стек для порядка закрытия и множество открытых ID для запрета повторного открытия. При close вершина стека должна совпадать с ticket_id.
Проверка порядка закрытия тикетов и вложенных подзаявок
Используйте стек для порядка закрытия и множество открытых ID для запрета повторного открытия. При close вершина стека должна совпадать с ticket_id.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В службе технической поддержки заявки (тикеты) могут порождать подзаявки.
Система логирует каждое действие: открытие или закрытие тикета. События поступают в хронологическом порядке.
Важно проверить, что последовательность событий корректна:
- Нельзя закрыть тикет, который не был открыт.
- Нельзя открыть уже открытый тикет (его ID уже присутствует среди открытых).
- Закрытие должно происходить в порядке, обратном открытию (вложенность): последний открытый тикет должен быть закрыт первым.
Реализовать функцию, которая принимает список событий (каждый элемент - словарь с ключами 'type' Типо: In word 'ключами' 'type'. ('open' или 'close') и 'ticket_id' (строка)) и возвращает True, если последовательность корректна, иначе False.
Примеры:
[
{'type': 'open', 'ticket_id': 'A'},
{'type': 'open', 'ticket_id': 'B'},
{'type': 'close', 'ticket_id': 'B'},
{'type': 'close', 'ticket_id': 'A'}
]
результат True
[
{'type': 'open', 'ticket_id': 'A'},
{'type': 'close', 'ticket_id': 'B'}
]
Результат False.
Ответ
Используйте стек для порядка закрытия и множество открытых ID для запрета повторного открытия. При close вершина стека должна совпадать с ticket_id.
def valid_events(events):
stack, opened = [], set()
for event in events:
kind, ticket = event.get('type'), event.get('ticket_id')
if not isinstance(ticket, str):
return False
if kind == 'open':
if ticket in opened:
return False
opened.add(ticket)
stack.append(ticket)
elif kind == 'close':
if not stack or stack[-1] != ticket:
return False
stack.pop()
opened.remove(ticket)
else:
return False
return not stack
Здесь последовательность считается завершённой: все открытые тикеты должны закрыться. Если допускается корректный незавершённый префикс журнала, последняя строка должна возвращать True. Повторно открыть уже закрытый ID условие не запрещает. Время O(n), память O(n).