Функция упорядочения маршрутов билетов

Постройте таблицу билетов по from и набор всех to. Начальный город — тот from, которого нет среди to; затем последовательно переходите по таблице.

Короткий ответ

Что ответить на собеседовании

Постройте таблицу билетов по from и набор всех to. Начальный город — тот from, которого нет среди to; затем последовательно переходите по таблице.

Подробный разбор

Ответ с пояснениями

Условие

Дан массив tickets, содержащий набор несвязанных билетов. Каждый билет – объект с полями from (откуда) и to (куда). Требуется написать функцию sortTickets(tickets), которая переставит элементы массива так, чтобы получилась последовательность перемещений путешественника от начального города до конечного.

Условия задачи:

  • Гарантируется, что из всех билетов образуется один непрерывный путь без замыканий.
  • Алгоритм должен работать за линейное время O(N).
  • Ограничения по дополнительной памяти отсутствуют.

Результатом работы функции должен стать массив билетов, отсортированный в порядке следования маршрута.

const tickets = [
  { from: 'Калининград', to: 'Челябинск' },
  { from: 'Москва', to: 'Калининград' },
  { from: 'Пятигорск', to: 'Краснодар' },
  { from: 'Челябинск', to: 'Астана' },
  { from: 'Краснодар', to: 'Москва' },
];

Ответ

Постройте таблицу билетов по from и набор всех to. Начальный город — тот from, которого нет среди to; затем последовательно переходите по таблице.

function sortTickets(tickets) {
  if (!tickets.length) return [];
  const byFrom = new Map(tickets.map(ticket => [ticket.from, ticket]));
  const destinations = new Set(tickets.map(ticket => ticket.to));
  const first = tickets.find(ticket => !destinations.has(ticket.from));
  if (!first || byFrom.size !== tickets.length) throw new Error('Не простой маршрут');
  const result = [];
  let current = first;
  while (current && result.length < tickets.length) {
    result.push(current);
    current = byFrom.get(current.to);
  }
  if (current || result.length !== tickets.length) throw new Error('Разрыв или цикл');
  return result;
}

Для примера старт — Пятигорск, финиш — Астана. Используется гарантия единственного пути без повторных исходящих городов; это не общий поиск эйлерова пути. Ожидаемое время O(n), память O(n), исходный массив не меняется.

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

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

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

Подробнее