9. 超市里的货物架调整 题解 | 豆包MarsCode AI刷题

69 阅读4分钟

问题描述

超市有一个包含 n 个格子的货物架,每个格子存放一种商品,用小写字母 a∼z 表示。顾客有一个想要购买的商品列表 c,他们依次从第一个格子开始查找,直到找到所需商品、遇到空格子、或查找结束。如果找到目标商品则购买并离开,若未找到则离开。作为管理员,你可以在顾客到来之前调整货物顺序,目标是使得卖出的商品数量最多。计算在最优调整下,最多可以卖出多少商品。

解题思路

核心问题是如何高效地匹配顾客的需求和货物的库存,最大化销售数量。在调整货物顺序后,以下几个关键点需要注意:

  1. 货物统计
    用哈希表记录每种商品的数量,统计货物架上每种商品的数量,用字典记录 s 中每种商品的库存。例如,若货物架为 s="abbc",统计结果为 {a:1, b:2, c:1}。
  2. 顾客需求处理
    遍历顾客需求列表 ccc,每次查看当前需求商品是否在库存中:
    • 若库存中有该商品且数量大于 0,则售出商品,库存减 1,售出商品计数增加。
    • 若库存不足或该商品不存在,则跳过当前需求。
  3. 售出规则
    按照需求列表 ccc 的顺序售出商品,每次售出后,库存更新,以确保后续商品匹配的准确性。例如,当需求为 c="bb" 时,匹配过程会消耗两件 b,库存从 {a:1, b:2, c:1} 变为 {a:1, b:0, c:1}。

解题步骤

  1. 统计货物库存:
    遍历货物字符串 s,用字典存储每种商品的数量。
  2. 遍历顾客需求:
    对顾客列表 c 中每种商品,检查是否在库存中。如果库存足够,售出商品并减少库存。
  3. 累加销售数量:
    将匹配成功的商品数量累加,得到最大销售量。
  4. 匹配最优调整的效果
    调整商品位置后,按需求列表从左到右依次匹配,即相当于尽可能把顾客需要的商品摆在前面以提高售出效率。

算法步骤

  1. 统计库存:
    遍历字符串 sss,用字典记录每种商品的数量,表示货物库存。
  2. 匹配顾客需求:
    遍历字符串 ccc,对每种顾客需求商品:
    • 如果商品在库存中且库存大于 0,则售出商品,计数器加 1,库存减 1。
    • 否则,跳过该商品。
  3. 返回结果:
    统计并返回售出的商品总数。

Python实现

def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计货物架上每种商品的数量
    shelf_count = {}
    for item in s:
        if item in shelf_count:
            shelf_count[item] += 1
        else:
            shelf_count[item] = 1

    # 统计能卖出的商品数量
    total_sold = 0
    
    for item in c:
        if item in shelf_count and shelf_count[item] > 0:
            total_sold += 1
            shelf_count[item] -= 1  # 购买后减少库存

    return total_sold


if __name__ == '__main__':
    print(solution(3, 4, "abc", "abcd") == 3)
    print(solution(4, 2, "abbc", "bb") == 2)
    print(solution(5, 4, "bcdea", "abcd") == 4)

复杂度分析

  1. 时间复杂度:

    • 遍历货物字符串 s:O(n)。
    • 遍历顾客需求 c:O(m)。
    • 总体复杂度为 O(n+m)。
  2. 空间复杂度:

    • 使用一个字典存储货物种类,大小为 O(1)(最多 26 个字母),总体空间复杂度为 O(1)。

测试样例

输入参数输出
n=3,m=4,s="abc",c="abcd"n = 3, m = 4, s = "abc", c = "abcd"33
n=4,m=2,s="abbc",c="bb"n = 4, m = 2, s = "abbc", c = "bb"22
n=5,m=4,s="bcdea",c="abcd"n = 5, m = 4, s = "bcdea", c = "abcd"44

思路优化

  1. 利用哈希表统计库存,保证快速查找和更新。
  2. 按需求顺序遍历,不涉及复杂的排列或排序操作,时间效率较高。
  3. 降低复杂度的同时,确保能够处理大规模数据(如 n,m 在百万级别)。

此解法平衡了可读性和高效性,适合直接应用于实际场景。