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

36 阅读2分钟

问题描述

在一个超市里,有一个包含 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

问题解析

这个问题看上去复杂,实际上注意问题的关键问句就可以简化。该问题最终要求得的是在最优调整下,最多可以卖出的商品数,故而无需求解“最优调整”的优化路径,而只需求解最理想状况下能售卖出的商品数,即库存所含顾客意愿购买商品量。

数据结构

由于字符串是不可变的,不利于字符的删除操作(即商品售卖后更新库存的操作),故将代表库存的字符串s转变为字符列表,以便进行更新。

算法步骤

  • 初始化

    • 将库存字符串s转换为字符列表s_lis
    • 初始化一个计数器 sold,用于记录已经卖出的商品数量。
  • 遍历字符列表

    • 从左到右遍历字符串c,寻找顾客可以购买的商品(即该商品仍有库存)。
    • 如果找到当前字符存在于库存列表s_lis的情况,进行购买操作,在s_lis中移出该字符以更新库存,并使 sold 计数+1。
  • 返回结果

    • 将卖出的商品数量sold返回。

代码

def solution(n: int, m: int, s: str, c: str) -> int:
    sold = 0
    s_lis = list(s)
    for j in c:
        if j in s_lis:
            sold += 1
            s_lis.remove(j)
        else:
            continue 
    return sold

关键点

善用多种数据结构,利用字符串和列表各自的特点,对购物订单列表和库存列表分别进行查找和更新,以满足题解需要。