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

37 阅读3分钟

问题描述

在一个超市里,有一个包含 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,当商品计数为0时,将该商品从字典中移除,不断更新。

关键点

  • 频率字典:用于统计每个商品的出现次数。
def solution(n: int, m: int, s: str, c: str) -> int:
    frequency = {}
    for item in s:
        if item in frequency:
            frequency[item] += 1
        else:
            frequency[item] = 1
  • 顾客需求处理:遍历顾客想要的商品种类,检查并更新频率字典和最大销售量。
    max_sales = 0
    for customer_item in c:
        if customer_item in frequency:
            max_sales += 1
            frequency[customer_item]-=1
  • 移除商品:当某个商品的计数减少到 0 时,从字典中移除该商品,以避免重复计算。
            if frequency[customer_item]==0:
                del frequency[customer_item]
  • 返回最大销售量
    return max_sales

示例

假设 s = "abc" 和 c = "abcd",代码的执行过程如下:

  1. 初始化 frequency 为 {'a': 1, 'b': 1, 'c': 1}
  2. 遍历 c
    • 对于 'a'max_sales 增加到 1,frequency 变为 {'a': 0, 'b': 1, 'c': 1},删除 'a'
    • 对于 'b'max_sales 增加到 2,frequency 变为 {'b': 0, 'c': 1},删除 'b'
    • 对于 'c'max_sales 增加到 3,frequency 变为 {'c': 0},删除 'c'
    • 对于 'd',不在 frequency 中,不做处理。
  3. 最终 max_sales 为 3。