Работа с массивами, удаление элементов, сортировка
Дан массив:20,16,15,30,17,21,15
Нужно сделать так чтобы было: 15-17,20-21,30
Т.е удалить из массива повторяющиеся числа, а порядковые числа типа 1,2,3,4,5 заменить на 1-5
Я отсортировал массив и удалил повторящиеся цифры, помогит сделать 1-5, 10-15 и т.д.
let arr=[16,15,17,21,20,30,30,15,16,21]
arr.sort((a, b) => a - b)
for(let j=0;j<=arr.length;j++)
{
if(arr[j]===arr[j+1])
{
arr.splice(j,1)
}
}
alert(arr);
Ответы (3 шт):
Проще всего оформлять серию, когда начинается новая серия. Примерно так:
let startidx = 0;
for (let j=1; j <= arr.length; j++) {
if (j==arr.length || arr[j]-arr[j-1]>1) {
if (j-1 == startidx) {
вывести одно число arr[startidx]
}
else {
вывести серию arr[startidx]-arr[j-1]
}
startidx = j;
}
}
Как вариант. Проходим по отсортированному массиву без дубликатов при помощи reduce() и копим последовательные числа в последнем элементе аккумулятора. Когда последовательность прерывается, заменяем этот накопитель на диапазон в строке (или на единственное число, если группа не набралась) и создаём новый накопитель. В конце обрабатываем самый последний накопитель.
const fs = require('fs');
const input = fs.readFileSync(0, 'utf-8');
console.log(solve(input));
function solve(input) {
const arr1 = input.split(',').map(str => Number(str.trim()));
const arr2 = [...new Set(arr1)] // Убираем дубликаты.
.sort((a, b) => a - b)
.reduce(
(acc, number, index, array) => {
if (index === 0) {
acc.push([number]);
} else {
const lastGroup = acc[acc.length - 1];
if (number === array[index - 1] + 1) {
lastGroup.push(number);
} else {
acc[acc.length - 1] = lastGroup.length > 1 ?
`${lastGroup[0]}-${lastGroup[lastGroup.length - 1]}` :
lastGroup[0];
acc.push([number]);
}
}
return acc;
},
[]
);
const lastGroup = arr2[arr2.length - 1];
arr2[arr2.length - 1] = lastGroup.length > 1 ?
`${lastGroup[0]}-${lastGroup[lastGroup.length - 1]}` :
lastGroup[0];
return arr2.join(',');
}
Ответ уже дан, но я хочу дополнить. Ваше удаление повторяющихся элементов не совсем верно. Вы можете убедиться в этом, запустив код на массиве
let arr=[16,16,16,21,20,30,30,45,90,90,4,15,16,21]
Попробуйте
for(let j=arr.length-1;j>0;j--)
{
if(arr[j]===arr[j-1])
{
arr.splice(j,1)
}
}
alert(arr);
Дело в том, что arr.length уменьшается, когда вы удаляете элемент и до конца вы просто не доходите.