我想出了两个用Python写的解决方案,但没有通过,也不知道为什么。
给定一个整数数组,其中1≤a[i]≤n(n =数组的大小), 一些元素出现两次,其他元素出现一次。
查找[1,n]中包含的所有元素,但不包括在内 阵列。
这是我的第一个解决方案:
class Solution(object):
def findDisappearedNumbers(self, nums):
nums=sorted(list(set(nums)))
for x in range(1, nums[-1] + 1):
if x in nums:
nums.remove(x)
else:
nums.append(x)
return nums
结果是“运行时错误消息:第4行:IndexError:列表索引超出范围”。但我没有得到它。
第二种解决方案:
return [x for x in range(1, len(nums) + 1) if x not in nums]
结果是“时间限制超出”,仍然困惑。
这两个解决方案在我的pycharm中使用python 2.7.11都可以正常工作。也许有一些测试用例我的解决方案没有通过,但我找不到它。
答案 0 :(得分:0)
首先,尝试使用xrange而不是range,因为当nums的值非常大时,这会占用更少的空间。此外,您尝试迭代以及在同一个数组中同时删除/追加值。这很可能是您收到错误的原因。
此外,删除列表中的值(如果它不在最后)需要花费很多时间,因为在它需要移动之前所有其他元素。
答案 1 :(得分:0)
从第一个解决方案:不要修改您正在迭代的列表。总是带来问题。更好地复制列表并修改列表!
class Solution(object):
def findDisappearedNumbers(self, nums):
nums=sorted(list(set(nums)))
nums_copy = nums.copy(nums)
for x in range(1, nums[-1] + 1):
if x in nums:
nums_copy.remove(x)
else:
nums_copy.append(x)
return nums_copy
另一方面,如果num
非常大(有很多元素)range
会带来问题,因为它会先创建列表(并且非常大的列表会占用大量内存)。对我来说,xrange
比返回发电机更好。
这在python3中不会发生,其中默认range
返回生成器。
答案 2 :(得分:0)
您可以使用 nums = set(nums)
排序并删除所有重复项。然后,您可以运行一个循环,将 nums
中不存在的所有数字附加到输出数组中。
答案 3 :(得分:-1)
如果测试输入为空列表,则第一个解决方案将失败,因为num [-1]会使索引超出范围。 你的第二个解决方案将很慢,因为它必须遍历列表。以下解决方案是否有效?设置操作已经过优化。但空间复杂性对你来说是否合适?
ret = set(range(1, len(nums)+1)) ret = ret - set(nums) return list(ret)