Алгоритм вычисления дубликатов в списке - PullRequest
1 голос
/ 18 октября 2019

Приведенный ниже код распечатывает числа, которые дублируются в A. Насколько я понимаю, цикл for проходит через каждый элемент в списке и превращает его в отрицательное число, хотя я не могу понять, почему он не превращает числа, которые он печатает (которые находятся в позиции 0,4,5), в отрицательные значения. .

A = [1,2,3,1,3,6,6]
def printRepeating(arr, size): 

    print("The repeating elements are: ") 

    for i,x in enumerate(arr): 

        if arr[abs(arr[i])] >= 0: 

            arr[abs(arr[i])] = -arr[abs(arr[i])] 
            print(arr)
        else: 
            print (abs(arr[i]), end = " ") 
printRepeating(A,len(A))

Ответы [ 4 ]

1 голос
/ 18 октября 2019

Алгоритм предполагает:

  1. все элементы массива начинаются как положительные числа, а
  2. все элементы массива меньше длины массива.

В вашем примере, так как длина массива равна 7, все элементы в массиве должны быть в диапазоне от 1 до 6.

Изменение алгоритма - это изменение array[k]отрицательно, чтобы указать, что k был замечен. Например, поскольку 1 - первое увиденное число, array[1] заменяется на отрицательное число. В следующий раз, когда видно 1, array[1] уже является отрицательным, поэтому 1 должен быть дубликатом.

1 голос
/ 18 октября 2019

Алгоритм предполагает, что все записи строго положительны и меньше длины списка. Затем он использует знак i -ого элемента для хранения, если он уже видел число i. В вашем примере:

A=[1,2,3,1,3,6,6]  Take 1
A[1] is positive, i.e. we have not seen it. Make it negative to mark it
A=[1,-2,3,1,3,6,6] Take -2  (stands for 2)
A[2] is positive, i.e. we have not seen it. Make it negative to mark it
A=[1,-2,-3,1,3,6,6] Take -3
A[3] is positive, i.e. we have not seen it. Make it negative to mark it
A=[1,-2,-3,-1,3,6,6] Take -1
A[1] is negative, i.e. we have already seen it. Report it.
A=[1,-2,-3,-1,3,6,6] Take 3
A[3] is negative, i.e. we have already seen it. Report it.
...
1 голос
/ 18 октября 2019

Если вы просто хотите напечатать повторяющиеся значения в списке, почему бы не попробовать это:

A = [1, 2, 3, 1, 3, 6, 6]
def get_repeated_elements(lst):
   return list(set((i for i in lst if lst.count(i) > 1)))
print(get_repeated_elements(A))

Эта функция преобразует переданный массив в генератор дублированных значений, а затем преобразует его в набор вотфильтруйте дубликаты в генераторе, а затем преобразуйте их в список для возврата вызывающей стороне. Это гораздо более короткая функция, чем указанная.

0 голосов
/ 18 октября 2019

Приведенный ниже код можно использовать для поиска повторяющихся элементов в списке, а также уникальных элементов в списке.

from collections import Counter
A = [1,2,3,1,3,6,6]

B =  Counter(A)

В строке ниже печатаются повторяющиеся элементы.

[k for k, v in B.items() if v > 1]
Output : [1, 3, 6]

ниже строки печатает уникальные элементы.

[k for k, v in B.items() if v == 1]
Output : [2]
...