长度为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的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一