leetcode每日一题: 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] 是小写字母
通过次数38,527提交次数52,200来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-common-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
今天的这道题难度是easy, 但是一点都不easy, 竟然牵连出一系列的知识
思路很简单, 代码更简单:
class Solution:
def commonChars(self, A: List[str]) -> List[str]:
return reduce(lambda x,y:x&y, map(Counter,A)).elements()
惊不惊喜意不意外? 就一行…
思路无非就是统计出每个单词中的每个字母的数量, 构建一个hashtable, 然后通过多个hashtable取交集,就能得到最终想要的结果.
这一行代码中包含了多少知识点, 咱们慢慢说:
reduce()
这个函数呢,来源于functools库,我们需要先执行
from functools import reduce
描述
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
语法
reduce() 函数语法:
reduce(function, iterable[, initializer])
参数
- function – 函数,有两个参数
- iterable – 可迭代对象
- initializer – 可选,初始参数
返回值
返回函数计算结果。
实例
以下实例展示了 reduce() 的使用方法:
>>>def add(x, y) : # 两数相加
... return x + y
...
>>> reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5
15
>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数
15
map()
描述
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
语法
map() 函数语法:
map(function, iterable, ...)
参数
- function – 函数
- iterable – 一个或多个序列
返回值
Python 2.x 返回列表。
Python 3.x 返回迭代器。
实例
以下实例展示了 map() 的使用方法:
>>>def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方 [1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
还有一个最重要的:
collections.Counter类
Counter(计数器):用于追踪值的出现次数
Counter类继承dict类,所以它能使用dict类里面的方法
创建一个Counter类
import collections
obj = collections.Counter('aabbccc')
print(obj)
#输出:Counter({'c': 3, 'a': 2, 'b': 2})
elements()
import collections
obj = collections.Counter('aabbccc')
print(sorted(obj.elements()))
#输出:['a', 'a', 'b', 'b', 'c', 'c', 'c']
for k in obj.elements(): #遍历打印obj所有元素
print(k)
most_common(指定一个参数n,列出前n个元素,不指定参数,则列出所有)
import collectionsobj = collections.Counter('aabbbcccc')print(obj.most_common(2))#输出:[('c', 4), ('b', 3)]
items(从dict类中继承的方法)
import collectionsobj = collections.Counter('aabbbcccc')print(obj.items())for k,v in obj.items(): print(k,v)#输出:dict_items([('b', 3), ('c', 4), ('a', 2)])# b 3# c 4# a 2
update(增加元素)
import collectionsobj = collections.Counter(['11','22'])obj.update(['22','55'])print(obj)#输出:Counter({'22': 2, '11': 1, '55': 1})
subtract(原来的元素减去新传入的元素)
import collectionsobj = collections.Counter(['11','22','33'])obj.subtract(['22','55'])print(obj)#输出:Counter({'11': 1, '33': 1, '22': 0, '55': -1})
感谢观看,有什么问题欢迎提出!