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