为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇潇雨雨 2021-05-06 15:11:36
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 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

您可以在O(n)时间和O(1)多余空间中找到数组中所有重复项的索引,如下所示:


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):

        # ...

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


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


查看完整回答
反对 回复 2021-05-11
?
GCT1015

TA贡献1827条经验 获得超4个赞

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


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)

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


查看完整回答
反对 回复 2021-05-11
  • 2 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信