leetcode每日一题: 1002. 查找常用字符

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

感谢观看,有什么问题欢迎提出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值