Учитывая массив целых чисел, найти и увеличить дубликаты значений с самой низкой суммой общего массива в Python? - PullRequest
0 голосов
/ 24 ноября 2018

Учитывая массив arr, мы хотим, чтобы он сделал его уникальным, увеличивая любые повторяющиеся элементы в arr так, чтобы сумма элементов arr unique была минимальной.Другими словами, если два или более элемента в arr не являются уникальными, мы должны увеличить значение дублирующего элемента (ов) до некоторого другого числа, чтобы arr состоял из уникальных элементов, которые суммируются с таким малым числомнасколько это возможно.

Например, если arr = [3, 2, 1, 2, 7], то arr unique = [3, 2, 1, 4, 7] и его элементы суммируются до минимального значенияиз 3 + 2 + 1 + 4 + 7 = 17.

Мой подход.который не выполняется

def inc_dup(a):
   i = 0
   while i < len(a):
      j = i + 1
      while j < len(a):
         if a[i] == a[j]:
            a[j] + 1
         else:
            j += 1
      i += 1

s = [3,2,4,5,4,3,6]
inc_dup(s)
print(s)
print(sum(s))

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Не так элегантно, как указано выше, но пост, так как мне было весело, пытаясь решить эту проблему

def incDup(list):
    dict = {}
    j = 0
    while j < len(list):
        if list[j] in dict: # if value has been seen, we keep increasing it
            list[j] += 1
        else: # first time seeing value
            dict[list[j]] = 1
            j += 1

     print(list)

incDup([3, 2, 1, 2, 7]) #[3, 2, 1, 4, 7]
incDup([3, 2, 2, 7, 7]) #[3, 2, 4, 7, 8]
0 голосов
/ 24 ноября 2018

Вы можете перебирать свой список, отслеживая элементы, находящиеся в покрытии, чтобы найти дубликат, и заменять его наименьшим возможным целым числом:

import sys

lst = [3, 2, 1, 2, 7]

visited = []
for i, x in enumerate(lst):
    if x in visited:
        lst[i] = next(a for a in range(1, sys.maxsize) if a not in visited)
        visited.append(lst[i])
    else:
        visited.append(x)

print(lst)
# [3, 2, 1, 4, 7]
...