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

138 阅读3分钟

问题描述: 在一个超市里,有一个包含n个格子的货物架,每个格子中有一种商品,商品用小写字母a到z表示。当顾客进入超市时,他们会依次从第一个格子查找到第n个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多的出售商品。当地一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明: #n:货架的格子数 #m:顾客想要购买的商品种类数 #s:货物架上商品的初始顺序 #c:顾客想要购买的商品种类 测试样例: 样例一:输入n=3,m=4,s="abc",c="abcd" 输出:3 样例二:输入:n=4,m=2,s="abbc",c="bb" 输出:2 样例三:输入:n=5,m=4,s="bcdea",c="abcd" 输出:4

问题分析

  1. 理解问题:我们需要在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。每个顾客只会购买他们想要的商品中第一个出现在货架上的商品。
  2. 目标:最大化售出的商品数量。
  3. 输入
    • n:货架的格子数
    • m:顾客想要购买的商品种类数
    • s:货架上商品的初始顺序
    • c:顾客想要购买的商品种类
  4. 输出:最多可以卖出多少件商品

解题思路

  1. 数据结构选择

    • 使用一个集合来存储顾客想要购买的商品种类,这样可以快速判断某个商品是否是顾客想要的。
    • 使用一个列表来存储货架上商品的初始顺序。
  2. 算法步骤

    • 遍历顾客想要购买的商品种类,尝试将这些商品尽可能靠前地放置在货架上。
    • 计算最终可以卖出的商品数量。

代码提示

以下是一些代码提示,帮助你实现这个算法:

def solution(n: int, m: int, s: str, c: str) -> int:
    # 将顾客想要购买的商品种类放入集合中
    wanted_items = set(c)
    
    # 初始化一个列表来存储调整后的货架顺序
    adjusted_shelf = []
    
    # 遍历货架上的商品,将顾客想要的商品优先放入调整后的货架
    for item in s:
        if item in wanted_items:
            adjusted_shelf.append(item)
            wanted_items.remove(item)  # 避免重复添加
    
    # 将剩余的商品放入调整后的货架
    for item in s:
        if item not in adjusted_shelf:
            adjusted_shelf.append(item)
    
    # 计算最终可以卖出的商品数量
    sold_items = 0
    for item in adjusted_shelf:
        if item in set(c):
            sold_items += 1
            c = c.replace(item, '', 1)  # 移除已经购买过的商品
    
    return sold_items

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. 将顾客想要购买的商品种类放入集合中:这样可以快速判断某个商品是否是顾客想要的。
  2. 遍历货架上的商品:将顾客想要的商品优先放入调整后的货架,并从集合中移除这些商品,避免重复添加。
  3. 计算最终可以卖出的商品数量:遍历调整后的货架,统计顾客可以购买的商品数量。