题目一:找出数组中的数字
在一个长度为n的数组里的所有数字都在0~n-1的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
遍历列表使列表中的元素值与索引值相等的位置交换,即索引的值要与该位置存储的元素值相同,那么当交换的时候有冲突出现,则数组中有重复的数字。
def duplicate(nums):
if not nums:
return False
nums_len = len(nums)
for nu in nums:
if nu < 0 or nu > nums_len-1:
return False
for ni in range(nums_len):
while nums[ni] != ni:
# print(nums)
cur = nums[ni]
if nums[ni] == nums[cur]:
return cur
nums[ni], nums[cur] = nums[cur], nums[ni]
return -1
seq = [2, 3, 1, 0, 2, 5, 3]
print(duplicate(seq))
题目二:不修改数组找出重复的数字
在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。
请找出数组中任意一个重复的数字,但不能修改输入的数组。
二分查找的思想,约束条件是区域内符合要求的值与区域长度的大小关系,决定是哪边区域有重复的值。
def get_duplication(nums):
if not nums:
return -1
low, high = 1, len(nums)-1
while low <= high:
mid = ((high-low) >> 1) + low
frq = len([nu for nu in nums if nu >= low and nu <= mid])
if low == high:
if frq > 1:
return low
else:
break
if frq > (mid-low+1):
high = mid
else:
low = mid + 1
# print(low, high)
return -1
seq = [2, 3, 5, 4, 3, 2, 6, 7]
print(get_duplication(seq))
(最近更新:2019年09月20日)