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

55 阅读3分钟

问题背景

  • 我们有一个长度为 n 的货架,上面摆放着 n 种不同的商品,每种商品由一个字符表示。
  • 同时,我们有一组顾客,他们想要购买的商品列表,长度为 m,每种商品也由一个字符表示。
  • 每个顾客只能买一种商品,且每个商品只能卖给一个顾客。

目标

  • 计算在最优情况下,能够卖出的最大商品数量。

解题思路

  1. 需求统计

    • 使用一个字典或 Counter 对象来统计顾客想要购买的各种商品的数量。这样我们可以快速查找每种商品的需求量。
  2. 遍历货架

    • 遍历货架上的每个位置(从 0 到 n-1),检查当前货架上的商品是否是顾客需要的。
    • 如果当前商品是顾客需要的,并且还有剩余需求,则将该商品售出,并更新需求量。
  3. 结果计算

    • 每次成功售出一个商品,就增加一个计数器,最终返回这个计数器的值。

代码分析

Python
深色版本
from collections import Counter

def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计顾客想要购买的商品种类的数量
    customer_counts = Counter(c)

    # 初始化结果为0
    result = 0

    # 遍历货架上的每个位置
    for i in range(n):
        # 如果当前格子中的商品是顾客需要的,并且该商品还有需求
        if s[i] in customer_counts and customer_counts[s[i]] > 0:
            # 减少该商品的需求量
            customer_counts[s[i]] -= 1
            # 增加卖出的商品数量
            result += 1

    return result

# 测试代码
print(solution(3, 4, "abc", "abcd"))  # 输出:3
print(solution(4, 2, "abbc", "bb"))   # 输出:2
print(solution(5, 4, "bcdea", "abcd"))  # 输出:4

详细步骤

  1. 需求统计

    • 使用 Counter(c) 来统计顾客需要的每种商品的数量。例如,对于 c = "abcd"customer_counts 将是 {'a': 1, 'b': 1, 'c': 1, 'd': 1}
  2. 初始化结果

    • 初始化一个变量 result 为 0,用于记录成功售出的商品数量。
  3. 遍历货架

    • 使用 for i in range(n) 遍历货架上的每个位置。
    • 对于每个位置 i,检查 s[i] 是否在 customer_counts 中,并且 customer_counts[s[i]] 是否大于 0。
    • 如果满足条件,则减少 customer_counts[s[i]] 的值,并增加 result
  4. 返回结果

    • 最后返回 result,即成功售出的商品数量。

测试用例分析

  1. 测试用例 1

    • 输入:n = 3m = 4s = "abc"c = "abcd"
    • 输出:3
    • 解释:货架上有 abc,顾客需要 abcd。可以成功售出 abc,共 3 件商品。
  2. 测试用例 2

    • 输入:n = 4m = 2s = "abbc"c = "bb"
    • 输出:2
    • 解释:货架上有 abbc,顾客需要 bb。可以成功售出两个 b,共 2 件商品。
  3. 测试用例 3

    • 输入:n = 5m = 4s = "bcdea"c = "abcd"
    • 输出:4
    • 解释:货架上有 bcdea,顾客需要 abcd。可以成功售出 abcd,共 4 件商品。

通过以上分析和代码实现,我们可以确保在最优情况下计算出能够卖出的最大商品数量。