题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
示例1
输入
复制
输出
复制
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
if not numbers:
return False
res = []
for i in numbers:
if i in res:
duplication[0] = i
return True
else:
res.append(i)
return False
方法二:1.遍历数组,判断当前位的值和这个值得下标是否相等,
2.如果相等,则遍历下一位
3.若不等,则将这个位置i上的元素和位置a[i]上的元素相比较,如果相等,则成功(原因:相等表示这个数第二次出现,因为前面已经让位置i的元素和位置a[i]上的元素交换,让a[i]位置上的值和它的下标对应,但位置i上的值和它的下标不一定对应,再次出现这个数之后,让再次出现的数和以这个数为下标的元素对比,如果相等,则找到重复的数字)若不等,则将它们两交换。换完之后a[i]位置上的值和它的下标是对应的,但i位置上的元素和下标并不一定对应。重复3.的操作,直到当前位置i的值也为i,将i向后移一位。再重复1.
操作结果是让遍历过的数字位置,让下标和下标对应值是相同的数组
该方法好处是不需要额外空间
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
for i in range(len(numbers)):
while numbers[i] != i:
temp = numbers[numbers[i]]
if temp == numbers[i]:
duplication[0] = numbers[i]
return True
else:
numbers[numbers[i]] = numbers[i]
numbers[i] = temp
return False