一,题目详情
1,问题描述
在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
2,测试样例
样例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. 详细分析
-
统计货架上的商品数量:
- 首先,我们需要统计货架上每种商品的数量。这可以通过遍历初始顺序字符串
s来实现。
- 首先,我们需要统计货架上每种商品的数量。这可以通过遍历初始顺序字符串
-
按顾客需求分配商品:
- 然后,我们遍历顾客需要的商品种类
c,对于每个顾客需要的商品,如果货架上还有该商品的库存,就将其分配给顾客,并减少货架上该商品的库存。
- 然后,我们遍历顾客需要的商品种类
-
统计总销量:
- 每次成功分配一个商品,我们就将销量计数器
sold_items增加1。
- 每次成功分配一个商品,我们就将销量计数器
三、代码实现
def solution(n: int, m: int, s: str, c: str) -> int:
# 统计货物架上的商品数量
shelf_count = {}
for item in s:
shelf_count[item] = shelf_count.get(item, 0) + 1
# 按顾客需求从货物架上取商品
sold_items = 0
for item in c:
if shelf_count.get(item, 0) > 0:
sold_items += 1
shelf_count[item] -= 1
return sold_items
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3) # 输出:True
print(solution(4, 2, "abbc", "bb") == 2) # 输出:True
print(solution(5, 4, "bcdea", "abcd") == 4) # 输出:True
四、逐步推演(以样例1为例)
输入:
n = 3, m = 4, s = "abc", c = "abcd"
推演过程如下:
| 步骤 | 操作 | 结果 |
|---|---|---|
| 1 | 统计货架上的商品数量 | shelf_count = {'a': 1, 'b': 1, 'c': 1} |
| 2 | 遍历顾客需求的商品种类 c | |
| 2.1 | 第一个顾客需要 'a' | 货架上有 'a',销量增加1,shelf_count['a'] = 0 |
| 2.2 | 第二个顾客需要 'b' | 货架上有 'b',销量增加1,shelf_count['b'] = 0 |
| 2.3 | 第三个顾客需要 'c' | 货架上有 'c',销量增加1,shelf_count['c'] = 0 |
| 2.4 | 第四个顾客需要 'd' | 货架上没有 'd',无法购买 |
| 3 | 返回总销量 | 3 |
最终结果为 3,与预期一致。
五、复杂度分析
-
时间复杂度:O(n + m)
- 统计货架上的商品数量需要 O(n) 时间。
- 遍历顾客需求的商品种类需要 O(m) 时间。
-
空间复杂度:O(1)
- 只使用了一个字典来统计商品数量,空间复杂度为 O(1)。
六、总结
通过统计货架上的商品数量并按顾客需求分配商品,我们实现了一个高效且简洁的解决方案。该算法具有以下特点:
- 高效性:时间复杂度为 O(n + m),适用于大多数场景。
- 鲁棒性:能够处理多种输入情况,包括复杂的顾客需求。
- 易读性:代码逻辑清晰,易于理解和维护。
这种解法不仅适用于本题,还可以广泛应用于类似的资源分配问题中。