[英]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.