python使用比我更有效的方法查找序列中唯一出现一次的元素



给定一个数字列表,其中除了一个数字外,每个数字都显示两次,找到那个数字。

示例:

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}

您想要返回numscount为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

最新更新