Python寻找数组中重复数字

 

题目描述:

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

解题思路:

第一种解题思路:最简单的,暴力破解:

整个数组从第一个数字开始,遍历第一个数字之后所有数字寻找是否有与第一个数字重复的数字,没有在从第二个开始在循环遍历第二个数字之后的所有数字寻找与第二个数字是否有重复的数字,以此类推,直到查找完数组中所有元素。

python代码实现如下:

'''

在一个长度为n的数组里的所有数字都在0到n-1的范围内。
 数组中某些数字是重复的,但不知道有几个数字是重复的。
 也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},
 那么对应的输出是第一个重复的数字2。

'''
class Solution:
    # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
    # 函数返回True/False
    def duplicate(self, numbers, duplication):
        # write code here
        n=len(numbers)
        for i in range(0,n):
            for j in range(i+1,n):
                if numbers[i] == numbers[j]:
                   duplication[0]=numbers[j]
                   return True
                
        return False
                
                
                
if __name__ == '__main__':
    s=Solution()
    print(s.duplicate([2,3,2,4],[None]))  
            

第二种解题思路

题目中指出了一个长度为n的数组里的所有数字都在0到n-1的范围内,也就是说,数组里的元素值字最大也不会超过n,

假设一个数组长度是6,这个数组中的元素值只可能是 0 1 2 3 4 5 这几个数。那么就可以这样考虑这个问题,我们使用元素值作为索引,他不会超出数组索引范围,当我们用元素值作为数组的下标索引时,将索引到的元素+n ,遇到下一次重复的元素时,用它作为下标去索引到的元素就会大于n, 证明这个元素之前被索引到,进而能证明下标索引就是数组中重复的元素。

举一个简单的例子更好的理解上面的那段话。

A= [2, 0,1,2]   可以看出这个数组长度是 4 

我们从头遍历数组 

将A[0]元素 2 作为下标索引 index   即 变成了 A[index]  = A[2] 然后将A[2]的值加长度n,这里就是加4. 然后A[2]= 5了

数组A就变成了 A=[2,0,5,2],然后再将A[1]元素 0 作为下标索引 index   即 变成了 A[index]  = A[0]  然后A[0]= 6了

这些都不重要,

依次遍历,知道最后 到将A[3]元素 2 作为下标索引 index  即  A[index]  = A[2]  我们之前将A[2]+ 4 了

A[2]的值大于数组长度 n, 所以这里能判断出之前索引过 A[2]  所以数组下标 2 是 数组中重复的数字。

也是数组中第一次出现重复的数字。

python实现代码如下:

# -*- coding:utf-8 -*-
class Solution:
    # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
    # 函数返回True/False
    def duplicate(self, numbers, duplication):
        # write code here
        n=len(numbers)
        for i in range(0,n):
            index = numbers[i]
            if index>=n:
                index-=n
            if numbers[index]>=n:
                duplication[0]=index
                return True
            numbers[index]+=n
        return False

第三种解题思路

????

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璃墟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值