问题描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
测试样例
样例1:
输入:
n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3
样例2:
输入:
n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2
样例3:
输入:
n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4
问题分析
为了求解最优调整下最多出售商品量,需要考虑以下几点:
1.最优调整
2.计数
已知顾客会离开的两种情况:
- 顾客中途遇到一个空格子
- 查找完所有格子还没有找到想要的商品
在第二种情况下,受客观条件限制顾客没有买到想要的商品,而在第一种情况中很有可能顾客想要的商品在空格子之后存在,而由于商品摆放顺序考虑不周导致顾客流失,没能达成“出售最多商品”这个目的。
那如何避免第一种情况呢?
我们可以想到将先到的顾客想要的商品摆在最后,最后到的顾客想要的商品摆在最前面。
可是顺着这个思路,作者发现这题干有点问题,若是考虑第一种情况在样例2中,第一个顾客和第二个顾客都要买b种类货品。那这样摆在前面的b种类货品势必会被第一个顾客买走,而第二个顾客必然会遇到空格子。这与输出结果相悖。
因此我觉得应该是出题者考虑不周,这道题根本不用考虑调整商品顺序,只用对供求端分别计数即可,而后面代码测试成功也验证了我的猜想。
代码
def solution(n: int, m: int, s: str, c: str) -> int:
from collections import Counter
# 统计货架上每种商品的出现频率
supply = Counter(s)
# 统计顾客对每种商品的需求量
demand=Counter(c)
sell_num=0
for item in demand:
if item in supply:
if supply[item]>demand[item]:
sell_num+=demand[item]
else:
sell_num+=supply[item]
return sell_num
# 测试样例
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3)
print(solution(4, 2, "abbc", "bb") == 2)
print(solution(5, 4, "bcdea", "abcd") == 4)
collections.Counter 是 Python 标准库 collections 模块中的一个类,专门用于计数可哈希对象的出现次数。它是一个字典的子类,因此具有字典的所有方法和属性,同时提供了一些额外的功能来方便地进行计数操作。
知识点
Counter 的特点
-
继承自字典:
Counter继承自 Python 的dict类,因此它具有字典的所有方法和属性。- 你可以像访问字典一样访问
Counter中的元素,例如counter['a']会返回元素'a'的出现次数。
-
自动计数:
Counter会自动统计传入的可迭代对象中每个元素的出现次数,并将结果存储为键值对,其中键是元素,值是该元素的出现次数。
-
支持字典操作:
- 你可以使用字典的常见操作,如
keys()、values()、items()等方法来访问Counter中的数据。
- 你可以使用字典的常见操作,如
-
额外功能:
Counter提供了一些额外的功能,如most_common()方法,用于返回出现次数最多的元素及其计数。