Собесов

LeetCode SQL — Exchange Seats: поменять местами соседние пары

SQLCASE по чётностиСредняяMiddle

Условие

Таблица Seat(id, student). id идут подряд от 1 до N. Поменяйте местами соседних: (1,2) → (2,1), (3,4) → (4,3) и т.д. Если N нечётно — последний остаётся на месте. Вернуть в порядке id.

Решение

Через CASE по чётности id

SELECT
  id,
  CASE
    WHEN id % 2 = 1 AND id = (SELECT MAX(id) FROM Seat) THEN student
    WHEN id % 2 = 1 THEN LEAD(student) OVER (ORDER BY id)
    ELSE LAG(student) OVER (ORDER BY id)
  END AS student
FROM Seat
ORDER BY id;

Альтернатива через id-инверсию

SELECT
  CASE
    WHEN id % 2 = 1 AND id = (SELECT MAX(id) FROM Seat) THEN id
    WHEN id % 2 = 1 THEN id + 1
    ELSE id - 1
  END AS id,
  student
FROM Seat
ORDER BY id;

Это перепаривает id (нечётный + 1, чётный – 1, последний нечётный оставляем). Финальный ORDER BY id восстанавливает порядок.

Подводные камни

  1. Нечётный N. Последний нечётный id не имеет пары — оставляем как есть, иначе он «обменяется в никуда» и пропадёт.
  2. LEAD/LAG на границе. LEAD(student) OVER (ORDER BY id) на последней строке вернёт NULL. Поэтому первый WHEN — обработка хвоста.
  3. Дыры в id. Если id не идут подряд (что в задаче исключено), id+1/id-1 сломаются. Использовать ROW_NUMBER() поверх id и переставлять номера.

Эталонный ответ

Два подхода: (а) CASE + LEAD/LAG подменяет student; (б) пересчёт id через CASE. Оба хвостом обрабатывают нечётное N. Вариант (б) короче и без оконных функций.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти