簡體   English   中英

查找序列中唯一出現一次的數字

[英]Find the only number to appear once in a sequence

給定一個數字列表,其中每個數字都出現兩次,除了一個數字,找到那個數字。

例子:

Input: [4, 3, 2, 4, 1, 3, 2]
Output: 1

這是 function 簽名:

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')
   

實際上,當單個元素有很多重復項時,您可以看到此解決方案最有效地工作,並且可以節省您對列表的計數,但上面的情況並非如此。這個解決方案甚至迫使我搜索兩個列表(元素和序列), 更糟糕的是;(

您可以使用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。

接下來,我們可以使用 function 和 lambda 在過濾器 function 中使用它,該過濾器迭代給定的可迭代對象並產生所有匹配的成員。

現在,因為我們知道只有 1 個數字會匹配,所以我們只需要返回第一個與我們的過濾器匹配的數字,因此在過濾器語句周圍使用next() next()返回從迭代器返回的下一項(在我們的例子中是filter )。

您想返回count為 1 的nums的第一個元素。請嘗試以下操作:

def singleNumber(nums):
    for x in nums:
        if nums.count(x) == 1:
            return x

print (singleNumber([4, 3, 2, 4, 1, 3, 2]))

Output:

1

這是一個通用的 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

Output {1}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM