2021-05-12 14:32:11
一道演演算法題,引出collections.Counter的特殊用法
2020-10-14 12:00:32
題目描述:
題目編號:1002. 查詢常用字元
給定僅有小寫字母組成的字串陣列 A,返回列表中的每個字串中都顯示的全部字元(包括重複字元)組成的列表。例如,如果一個字元在每個字串中出現 3 次,但不是 4 次,則需要在最終答案中包含該字元 3 次。
你可以按任意順序返回答案。
範例 1:
輸入:["bella","label","roller"]
輸出:["e","l","l"]
範例 2:
輸入:["cool","lock","cook"]
輸出:["c","o"]
提示:
1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小寫字母
以上內容來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/find-common-characters
題目答案:
from collections import Counter
class Solution:
def commonChars(self, A: List[str]) -> List[str]:
res = None
for a in A:
c = Counter(a)
if res is None:
res = c
else:
res &= c
return list(res.elements())
題解看到一個一行流,膜拜一下 boille
class Solution:
def commonChars(self, A: List[str]) -> List[str]:
return list(reduce(lambda x, y: x & y, map(collections.Counter, A)).elements())
以上內容來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/find-common-characters/solution/cha-zhao-chang-yong-zi-fu-by-leetcode-solution/
作者:zyyyyy
疑問:
題解中的res &= c
是什麼鬼?為什麼能夠達到解題思路中的,得到計數最小的效果?
看了題解下的解答,有人說是&
在Counter中,是一種特殊的用法,獲取交接中結果,但是這個解釋不是很清晰,未能打消我的疑惑,所以進行了進一步的研究。
查到了一篇檔案:Python計數器collections.Counter用法詳解
最後介紹了Counter的&
的用法。
答疑:
res &= c,展開式:res = res & c
Counter特有的算數運算,使用&時,取兩個Counter物件中交集元素計數小的結果。
例子:
Counter('AAB') & Counter('BBCC') 的輸出結果是:{'B': 1}
過程:
第一步:得到元素計數:{'A':2, "B":1} 和 {'B':2,'C':2}
第二步:取交集:{"B":1} & {'B':2}
第三步:得出結果:取計數小的結果:{'B': 1}
本文首發於BigYoung小站
相關文章