长度为n值域为[0,n-1]的数组中重复的数字

Posted 除了心跳都忘掉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了长度为n值域为[0,n-1]的数组中重复的数字相关的知识,希望对你有一定的参考价值。

问题描述

在一个长度为n的数组里,所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。要找出数组中任意一个重复的数字。

解决思路

n 个数字因为它们都在 0 到 n - 1 的范围内,如果不重复,每一个数字都能被放在 nums[i] = i 的位置上 (值与索引相同)

遍历数组,比较 i 和 nums[i],有两种情况

  • i == nums[i],进入下一循环,因为 nums[i] “放在了正确的位置”
  • i != nums[i],这意味着 nums[i] 没有被放在正确的位置上(nums[i] 应该被放在 nums[ nums[i] ]上
    将 nums[i] 和 nums[ nums[i] ] 作比较:
    ① 如果相等则返回nums[i](nums[i] 出现了两次)
    ② 如果不等就交换它们的位置,使 nums[i] 放到正确的位置,继续比较 i 和 nums[i],直到:1)i = nums[i] 则进入下一循环(位置 i 上放上了正确的数字)2)nums[i] = nums[ nums[i] ] 则返回

代码

def findRepeated(nums):

    for i in range(len(nums)):
        if not -1 < nums[i] < len(nums):
            return -1

    for i in range(len(nums)):
        while nums[i] != i:
            if nums[i] == nums[nums[i]]:
                return nums[i]
            else:
                temp = nums[i]
                nums[i] = nums[temp]
                nums[temp] = temp
    return -1


def acquireNums():
    while True:
        sourceStr = input() # 相邻元素以空格分隔
        if sourceStr == 'exit': break

        lyst = sourceStr.split(sep=' ')

        if lyst == None or len(lyst) <= 1:
            print(-1)

        nums = list(map(int, lyst))
        print(findRepeated(nums))


if __name__ == '__main__':
    acquireNums()

以上是关于长度为n值域为[0,n-1]的数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

找出长度为n的数组中重复的一个数字(数字范围在0~n-1) 不采用hashmap

剑指offer(Java版)第一题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一

数组中重复的数字 --剑指offer

数组中重复的数字

数组中重复的数字

剑指offer09-数组中重复的数字