JZ50 数组中重复的数字

描述

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

讨论组有看到一个替换法,博主说原理是

遍历nums数组,对每个元素,令其作为索引,使其指向的元素为负数。

  • 当元素映射到一个负数,说明此映射之前出现过,找到重复项

按照代码走了一遍,大概可以理解了:

class Solution:
    def duplicate(self , numbers ):
        # write code here
        if not numbers:
            return -1
        n = len(numbers)
        for i in range(n):
            v = numbers[i]
            if v < 0:
                v += n
            if numbers[v] < 0:
                return v
            numbers[v] -= n
        return -1

初始状态:[2,3,1,0,2,5,3]

n = 7

for i in range(n):

       v = numbers[i]

第一次for:[2,3,1,0,2,5,3]

代入v = 2:此时v不小于0,numbers[2]为1也不小于0,所以numbers[2] -= 7,也就是1减去7变成-6.

第二次for:[2,3,-6,0,2,5,3]

代入v = 3:此时v不小于0,numbers[3]为0也不小于0,所以numbers[3] -= 7,也就是0减去7变成-7.

第三次for:[2,3,-6,-7,2,5,3]

代入v = -6:此时v小于0,所以v += 7,也就是-6加上7变成1.此时numbers[1]=3还是不小于0,numbers[1] -= 7,也就是3减去7变成-4.

第四次for:[2,-4,-6,-7,2,5,3]

代入v = -7:此时v小于0,所以v += 7,也就是-7加上7变成0.此时numbers[0]=2还是不小于0,numbers[0] -= 7,也就是2减去7变成-5.

第五次for:[-5,-4,-6,-7,2,5,3]

代入v = 2:此时v不小于0,numbers[2]为-6小于0,所以return 2.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值