Формирование строкового представления диапазонов чисел массива

Отсортируйте уникальные числа, проходите по соседним значениям и закрывайте диапазон, когда очередное число не равно предыдущему плюс один.

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

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

Отсортируйте уникальные числа, проходите по соседним значениям и закрывайте диапазон, когда очередное число не равно предыдущему плюс один.

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

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

Условие

Необходимо написать функцию range, принимающую массив целых чисел и возвращающую строку, в которой указаны все непрерывные диапазоны значений. Диапазоны объединяются в виде начало-конец, одиночные числа выводятся без дефиса, а отдельные диапазоны разделяются запятыми.

range([1, 4, 5, 2, 3, 9, 8, 11, 0]) // '0-5,8-9,11'
range([1, 4, 3, 2]) // '1-4'

function range(numbers) {
}

Ответ

Отсортируйте уникальные числа, проходите по соседним значениям и закрывайте диапазон, когда очередное число не равно предыдущему плюс один.

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

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

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

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

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

Подробнее