剑指Offer(Python多种思路实现):数组中重复的数字
不修改数组找出重复的数字面试3题:
题:数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路一:先把输入数组排序,然后从排序后的数组中从前往后找。
解题代码:
def duplicate(self, numbers, duplication):
if numbers==None or len(numbers)<=1:
return False
for i in range(len(numbers)):
if numbers[i]<0 or numbers[i]>len(numbers)-1:
return False
numbers.sort()
for i in range(len(numbers)-1):
if numbers[i] == numbers[i+1]:
duplication[0]=numbers[i] # 任意重复的一个值并赋值到duplication[0]
return True
return False
解题思路二:重排数组
def duplicate(self, numbers, duplication):
if numbers==None or len(numbers)<=1: # 数组为空或者数组没有重复数字
return False
for i in range(len(numbers)):
if numbers[i]<0 or number[i]>len(numbers)-1: # 数组超出了范围
return False
for i in range(len(numbers)):
while (numbers[i]!=i):
if numbers[i]==numbers[numbers[i]]:
duplication[0]=numbers[i]
return True
else:
temp=numbers[i]
numbers[i]=numbers[temp]
numbers[temp]=temp
return False
解题思路三:不修改数组找出重复的数字。
# 三、不修改数组
# def find_duplicate(nums: list) -> int:
def countRange(self, numbers, start, end):
if not numbers: return 0
return sum(start<=number<=j for number in numbers)
def duplicate(self, numbers):
if not numbers or len(numbers)<=0:
return False
start=1
end=len(numbers)-1
while start<=end:
middle=(end-start)//2+start # 算中位数公式
count=self.countRange(numbers, start, middle)
if start==end:
if count > 1:
return start
else:
break
if count > middle-start+1:
end=middle
else:
start=middle+1
return False