Find All Duplicates in an Array
这道题就是之前看亚马逊面经资料的时候的一个只给了思路没有代码的题,不过这个思路解决此题属于杀鸡用牛刀,因为那个方法是可以泛化到找任意次的重复数的,总得来说就是找一个这个数组里面不可能出现的数,对元素遍历时就在此元素本应在的位置上加一个这个数,最后我们只要再遍历除这个数就能得到各个数的对应次数了,这里还有一个小问题要注意就是第一遍循环时有可能有些数因为修改已经不是本来的值了,我们这时候需要模这个加上的数来还原到原始数再去找下标,不然数组会越界
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
n = len(nums) + 1
for num in nums:
nums[num % n - 1] += n
result = []
for index, num in enumerate(nums):
if num / n == 2:
result.append(index + 1)
return result
还有一个one pass的方法,这个方法更加依赖于题目条件,即有些数准确出现了两次,有些数出现了一次,而没有其他干扰项,这个时候我们完全可以根据正负数的翻转来得到结果
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
result = []
for num in nums:
if nums[abs(num) - 1] < 0:
result.append(abs(num))
else:
nums[abs(num) - 1] *= -1
return result