Удалите дубликаты, отсортируйте числа и объедините соседние значения, отличающиеся на единицу. Каждый завершённый участок превращается в число либо диапазон.
Объединение чисел в диапазоны
Удалите дубликаты, отсортируйте числа и объедините соседние значения, отличающиеся на единицу. Каждый завершённый участок превращается в число либо диапазон.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан массив целых чисел. Необходимо преобразовать его в строку, объединив последовательные числа в диапазоны вида "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).