使用 Python 解题 - 超市里的货物架调整

83 阅读3分钟

一,题目详情

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

f984b5439bd29bd496d4e82c7cfad0f.png

二、解题思路

1. 问题分析

我们需要计算在最优调整下,最多可以卖出多少件商品。最优调整的定义是重新排列货架上的商品,使得尽可能多的顾客能找到他们需要的商品。

2. 详细分析

  1. 统计货架上的商品数量

    • 首先,我们需要统计货架上每种商品的数量。这可以通过遍历初始顺序字符串 s 来实现。
  2. 按顾客需求分配商品

    • 然后,我们遍历顾客需要的商品种类 c,对于每个顾客需要的商品,如果货架上还有该商品的库存,就将其分配给顾客,并减少货架上该商品的库存。
  3. 统计总销量

    • 每次成功分配一个商品,我们就将销量计数器 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,与预期一致。


五、复杂度分析

  1. 时间复杂度:O(n + m)

    • 统计货架上的商品数量需要 O(n) 时间。
    • 遍历顾客需求的商品种类需要 O(m) 时间。
  2. 空间复杂度:O(1)

    • 只使用了一个字典来统计商品数量,空间复杂度为 O(1)。

六、总结

通过统计货架上的商品数量并按顾客需求分配商品,我们实现了一个高效且简洁的解决方案。该算法具有以下特点:

  1. 高效性:时间复杂度为 O(n + m),适用于大多数场景。
  2. 鲁棒性:能够处理多种输入情况,包括复杂的顾客需求。
  3. 易读性:代码逻辑清晰,易于理解和维护。

这种解法不仅适用于本题,还可以广泛应用于类似的资源分配问题中。

dee06433f41a51d2f7050ad3820ab4d.png