Проверка порядка закрытия тикетов и вложенных подзаявок

Используйте стек для порядка закрытия и множество открытых 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).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее