【发布时间】:2015-07-17 04:14:28
【问题描述】:
我的面试问题是我需要返回删除重复的数组的长度,但我们最多可以留下 2 个重复。
例如,[1, 1, 1, 2, 2, 3] 新数组将是 [1, 1, 2, 2, 3]。所以新的长度是 5。我想出了一个 O(2n) 的算法,我相信。我怎样才能提高它是最快的。
def removeDuplicates(nums):
if nums is None:
return 0
if len(nums) == 0:
return 0
if len(nums) == 1:
return 1
new_array = {}
for num in nums:
new_array[num] = new_array.get(num, 0) + 1
new_length = 0
for key in new_array:
if new_array[key] > 2:
new_length = new_length + 2
else:
new_length = new_length + new_array[key]
return new_length
new_length = removeDuplicates([1, 1, 1, 2, 2, 3])
assert new_length == 5
我的第一个问题是我的算法是否正确?
【问题讨论】:
-
使用
Counter或dict -
@JonathonReinhart 代码审查只接受按预期工作的代码 - 这篇文章底部的问题可能需要重新措辞以避免吸引“不清楚你're ask' 或 "broken code" close votes。
-
O(2n) = O(n),你不能做得比这更好,因为你必须读取整个数组。如果您正在寻找恒定时间加速,请考虑profiling。
-
你的代码看起来和我能得到的一样好。
-
您可以“最多保留 2 个重复项”,这意味着您可以有零个重复项,对吗?那么为什么不
list(set([1,1,1,2,2,3]))?也应该是 O(n) 但更简单