题目描述:
数字1-1000放在含有1001个元素的数组中,其中只有唯一的一个元素值重复,其他数字均只出现一次。设计一个算法,将重复元素找出来,要求每个数组元素只能访问一次。
"""
方法功能:在数组中找唯一重复的元素
输入参数:array:数组对象的引用
返回值:重复元素的值,如果无重复元素则返回-1
"""
# 使用字典
def findDup1(array):
if array == None:
return -1
lens = len(array)
hashTable = dict()
i = 0
while i < lens-1:
hashTable[i] = 0
i += 1
# print(hashTable) result:{0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
j = 0
while j < lens:
if hashTable[array[j]-1] == 0:
hashTable[array[j]-1] = array[j]-1
else:
return array[j]
j += 1
return -1
# 异或法
def findDup2(array):
if array == None:
return -1
lens = len(array)
result = 0
i = 0
while i < lens:
result ^= array[i]
print(result)
i += 1
j = 1
while j < lens:
result ^= j
j += 1
return result
# 数据映射法:
def findDup3(array):
if array == None:
return -1
lens = len(array)
index = 0
i = 0
while True:
# 数组中的元素值只能小于len,否则会越界
if array[i] >= lens:
return -1
if array[index] < 0:
break
# 访问过,通过变相反数的方法进行标记
array[index] *= -1
# index的后继为array[index]
index = -1*array[index]
if index>=lens:
print("数组中有非法数字")
return -1
return array[index]
# 环形相遇法
def findDup4(array):
if array == None:
return -1
slow = 0
fast = 0
while True:
fast = array[array[fast]] # fast一次走两步
slow = array[slow] # slow一次走一步
if slow == fast:
break
fast = 0
while True:
fast = array[fast]
slow = array[slow]
if fast == slow: # 找到入口点
return slow
if __name__=="__main__":
array=[1, 3, 4, 2, 5, 3]
print(findDup3(array))