Объединение чисел в диапазоны

Удалите дубликаты, отсортируйте числа и объедините соседние значения, отличающиеся на единицу. Каждый завершённый участок превращается в число либо диапазон.

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

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

Удалите дубликаты, отсортируйте числа и объедините соседние значения, отличающиеся на единицу. Каждый завершённый участок превращается в число либо диапазон.

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

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

Условие

Дан массив целых чисел. Необходимо преобразовать его в строку, объединив последовательные числа в диапазоны вида "a-b", а одиночные числа оставить как есть. Результат должен быть строкой с перечислением диапазонов и чисел через запятую.

// Вход: [1, 4, 5, 2, 3, 9, 8, 11, 0]
// Выход: "0-5,8-9,11"
// (Числа 0, 1, 2, 3, 4, 5 образуют диапазон 0–5, 8 и 9 — 8–9, а 11 остаётся отдельно)

Ответ

Удалите дубликаты, отсортируйте числа и объедините соседние значения, отличающиеся на единицу. Каждый завершённый участок превращается в число либо диапазон.

function ranges(numbers) {
  const values = [...new Set(numbers)].sort((a, b) => a - b);
  const result = [];
  for (let i = 0; i < values.length; i++) {
    const start = values[i];
    let end = start;
    while (i + 1 < values.length && values[i + 1] === end + 1) end = values[++i];
    result.push(start === end ? String(start) : `${start}-${end}`);
  }
  return result.join(',');
}

Пример даёт 0-5,8-9,11; пустой массив — пустую строку. Предполагаются безопасные целые числа. Отрицательные значения тоже поддерживаются, например -3--1; если такой текст неудобен для чтения, согласуйте другой разделитель диапазона. Время O(n log n), память O(n).

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

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

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

Подробнее