我想找出重复元素数组中元素的索引

时间:2018-07-25 21:21:49

标签: python arrays

a=[2, 1, 3, 5, 3, 2]

def firstDuplicate(a):
    for i in range(0,len(a)):
        for j in range(i+1,len(a)):                
            while a[i]==a[j]:
                num=[j]
                break
    print(num)

print(firstDuplicate(a))

输出应该是4和5,但只能是4

2 个答案:

答案 0 :(得分:1)

您可以find the indices of all duplicates in an array in O(n) time and O(1) extra space使用以下内容:

def get_duplicate_indices(arr):
    inds = []
    for i, val in enumerate(arr):
        val = abs(val)
        if arr[val] >= 0:
            arr[val] = -arr[val]
        else:
            inds.append(i)
    return inds

get_duplicate_indices(a)
[4, 5]

请注意,这将修改数组!如果要保持输入数组不变,请将上面的前几行替换为:

def get_duplicate_indices(a):
    arr = a.copy()  # so we don't modify in place. Drawback is it's not O(n) extra space
    inds = []
    for i, val in enumerate(a):
        # ...

从本质上讲,这使用数组中每个元素的 sign 来指示以前是否看到过数字。如果我们遇到一个负值,则意味着我们已经看到过到达的数字,因此我们将该数字的索引附加到我们已经看到的索引列表中。

请注意,如果数组中的值大于数组的长度,则可能会遇到麻烦,但是在这种情况下,我们只是将工作数组扩展为与输入中的最大值相同的长度。容易。

答案 1 :(得分:0)

您的代码有些错误。以下将收集每个第一个重复项的索引:

def firstDuplicate(a):
    num = []  # list to collect indexes of first dupes
    for i in range(len(a)-1):  # second to last is enough here
        for j in range(i+1, len(a)):                
            if a[i]==a[j]:  # while-loop made little sense
                num.append(j)  # grow list and do not override it
                break  # stop inner loop after first duplicate
    print(num)

当然,还有更多高性能算法可以实现这一点,而不是二次方。