@DanceMonkeyTime

Как найти минимальную сумму после уникализации элементов массива путём инкрементирования дубликатов?

Есть массив, состоящий из целых чисел, например:

let arr = [20,1659,710,710,1730,1808,2043,1613,1841,1328,504,1730,2545,493,879,1441,2043,1613,710,1613,1250]

В нем есть дубликаты. Иногда это только один дубликат, иногда 10.
Каждый дубликат должен идти на 1 больше, чем прежний.

То есть, если у меня есть 710 + 710 + 710, это должно быть 710 + 711 + 712.

Мне нужно избавится от дубликатов путем инкрементирования и потом весь массив просуммировать.

Я сделал уже функцию, но она работает только если есть один дубликат. Если есть несколько, они будет суммировать прежний, то есть 710 + 710 + 710 = 710 + 711 + 711.

function getMinimumUniqueSum(arr) {
    const duplicateValues = arr.filter((e, i, a) => a.indexOf(e) !== i);
    const uniqueValues = arr.filter((e, i, a) => a.indexOf(e) === i);
    const newArr = [...uniqueValues, ...incrementedValues];
    
    return newArr.reduce((a, b) => a + b, 0);
}

getMinimumUniqueSum(arr) выдаёт 28269, а должно 28291.
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
0xD34F
@0xD34F
Отсортировать массив, при суммировании в качестве слагаемого брать текущий элемент массива или предыдущее слагаемое + 1, в зависимости от того, кто окажется больше:

const getMinimumUniqueSum = arr => [...arr]
  .sort((a, b) => a - b)
  .reduce((acc, n) => (acc[1] += acc[0] = Math.max(acc[0] + 1, n), acc), [ -Infinity, 0 ])
  .pop();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы