给定一个数字列表,其中除了一个数字外,每个数字都显示两次,找到那个数字。
示例:
Input: [4, 3, 2, 4, 1, 3, 2]
Output: 1
这是函数签名:
def singleNumber(nums):
# Fill this in.
print singleNumber([4, 3, 2, 4, 1, 3, 2])
# 1
有人能提供一种有效的方法来搜索这个号码吗?
这就是我的解决方案:
def check(seq):
element =[]
for i in seq:
if i not in element:
element.append(i)
if seq.count(i)==1:
return i
return('Target not found')
事实上,当序列中有大量单个元素的重复时,您可以看到这个解决方案最有效地工作,然后它可以使您免于一次又一次地迭代序列,而不是上面的情况。我的解决方案甚至迫使我搜索两个列表(element和seq(,这是不够有效的。
您可以使用Counter
对列表中的元素进行计数。因为你知道只有一个元素出现过一次,它将是最不常见的元素,所以:
def singleNumber(nums):
return Counter(nums).most_common()[-1][0]
如果您想在一行中使用它,可以使用filter
:
def singleNumber(nums):
return next(filter(lambda num: nums.count(num) == 1, nums))
这有点复杂,所以让我们把它分解一下:
首先,我们确定谓词是什么:
由于我们想要在列表中只出现一次的第一个元素,我们知道nums.count(num)
应该等于1。
接下来,我们可以将该函数与lambda一起用于筛选函数,该函数对给定的可迭代对象进行迭代并生成所有匹配的成员。
现在,由于我们知道只有1个数字会匹配,所以我们只需要返回与我们的筛选器匹配的第一个数字,即filter语句周围的next()
。next()
返回迭代器返回的下一个项(在本例中为filter
(。
这是一个通用的O(n(解决方案。它适用于任何数量的独特项目。
这是使用集合来跟踪可见和重复的元素,并使用集合差异来获得唯一的项目:
nums = [4, 3, 2, 4, 1, 3, 2]
seen = set()
dup = set()
for i in nums:
dup.add(i) if i in seen else seen.add(i)
seen-dup
输出{1}
您想要返回nums
中count
为1的第一个元素。尝试以下操作:
def singleNumber(nums):
for x in nums:
if nums.count(x) == 1:
return x
print (singleNumber([4, 3, 2, 4, 1, 3, 2]))
输出:
1