📅  最后修改于: 2023-12-03 14:50:47.120000             🧑  作者: Mango
这是ISRO CS 2014中的第72个问题。
一个数组由所有从1至6000000的整数组成,这些数字随机无序的存储在数组中。现在,它的某些数字被重复了,并且重复了多次。你的任务是从中找出重复了2次及以上的数字,并以升序输出它们。
问题的关键是在于空间复杂度必须O(1)。考虑到该数组的数字范围,可以基于数组下标的转换建立单纯链表(Singly Linked List)。即对于每个下标i存储一个节点,节点中的元素为值为i的元素在数组中的位置。
重复的数字显然会对应到多个节点,因此需要标记是否已经计算过该数字。可以通过将对应节点的值逆转为负号,来标记该节点已经被遍历过。最后再遍历一遍整个数组,输出所有值为负数的节点所对应的数字。
def findDuplicate(arr):
# 数组下标转换为单纯链表
for i in range(len(arr)):
arr[arr[i] % len(arr)] += len(arr)
# 寻找重复的数字
duplicates = []
for i in range(len(arr)):
if arr[i] >= 2 * len(arr):
duplicates.append(i)
# 恢复链表并输出重复数字
for i in range(len(arr)):
if arr[i] < 0:
arr[i] = -arr[i]
return sorted(duplicates)
该程序利用Python语言的特性实现,可以对长度为6000000的数组进行快速计算。程序的时间复杂度大约为O(nlogn),但由于数组元素较多,网络传输时间也需要考虑。