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

89 阅读5分钟

题目解析

我们有一个长度为 n 的商品列表 s,其中每个商品用一个小写字母表示。顾客会依次来购买他们想要的商品,商品列表中的商品顺序是不变的,但是我们可以在顾客到来之前重新安排商品位置,使得尽可能多的商品能被售出。

在顾客来购买商品时,顾客会从商品列表的开头开始检查,直到找到他们想要的商品。如果他们找到,就会把商品取走;如果没有找到,或者途中遇到空格(未调整的商品位置),他们就会离开。

思路

  1. 最优调整策略:为了让顾客尽可能多买到商品,我们需要尽可能在商品架的前面安置顾客想要的商品。具体来说,我们可以将顾客想要的商品按他们到来的顺序放到商品架的前面。这样,商品更容易被顾客找到。
  2. 顾客购买流程:每个顾客按照他们希望购买的商品顺序去商品架上查找,如果找到了就购买并继续,直到商品找完或者遇到一个空格。

解题步骤

  1. 统计货架上的商品数量:首先统计商品架上每种商品的数量。这有助于了解我们可以售出多少件商品。
  2. 模拟顾客购买商品的过程:对于每个顾客所需要的商品,我们检查商品架上是否有剩余库存。如果有,就卖出该商品,并减少相应的库存。
  3. 返回卖出的商品数量

代码实现

pythonCopy Code
def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计货架上的商品数量
    stock = {}
    for item in s:
        if item in stock:
            stock[item] += 1
        else:
            stock[item] = 1
    
    sold_count = 0
    for item in c:
        # 若货架上有商品且数量大于0,则可以售出
        if item in stock and stock[item] > 0:
            sold_count += 1
            stock[item] -= 1  # 售出一件商品,数量减1

    return sold_count

代码解析

  1. 统计库存 (stock)

    • 使用一个字典来记录商品架上每种商品的数量,遍历商品架字符串 s,统计每种商品的出现次数。
  2. 顾客购买商品 (c)

    • 对于每个顾客希望购买的商品 item,检查该商品在库存中的数量。
    • 如果库存中有该商品且数量大于 0,顾客可以购买该商品,并将该商品的库存数量减 1,售出商品数加 1。
  3. 返回结果

    • 最后返回售出的商品数量 sold_count

示例解析

示例1

输入:

Copy Code
n = 3, m = 4, s = "abc", c = "abcd"
  • 初始商品架:"abc"
  • 顾客的需求:"abcd"

过程

  1. 第一个顾客想要商品 'a',在商品架上找到 'a',售出 'a',剩余商品架 ["b", "c"]
  2. 第二个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架 ["c"]
  3. 第三个顾客想要商品 'c',在商品架上找到 'c',售出 'c',剩余商品架 []

结果:最多可以售出 3 件商品。

输出:

Copy Code
3

示例2

输入:

Copy Code
n = 4, m = 2, s = "abbc", c = "bb"
  • 初始商品架:"abbc"
  • 顾客的需求:"bb"

过程

  1. 第一个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架 ["a", "b", "c"]
  2. 第二个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架 ["a", "c"]

结果:最多可以售出 2 件商品。

输出:

Copy Code
2

示例3

输入:

Copy Code
n = 5, m = 4, s = "bcdea", c = "abcd"
  • 初始商品架:"bcdea"
  • 顾客的需求:"abcd"

过程

  1. 第一个顾客想要商品 'a',在商品架上找到 'a',售出 'a',剩余商品架 ["b", "c", "d", "e"]
  2. 第二个顾客想要商品 'b',在商品架上找到 'b',售出 'b',剩余商品架 ["c", "d", "e"]
  3. 第三个顾客想要商品 'c',在商品架上找到 'c',售出 'c',剩余商品架 ["d", "e"]
  4. 第四个顾客想要商品 'd',在商品架上找到 'd',售出 'd',剩余商品架 ["e"]

结果:最多可以售出 4 件商品。

输出:

Copy Code
4

学习总结

  1. 字典的使用:本题中我们用字典来存储商品库存数量,这样能够高效地查询和更新商品的数量。
  2. 贪心策略:此问题的本质是一个贪心算法问题,我们尽量让顾客找到他们想要的商品,以最大化销售数量。
  3. 模拟顾客购买过程:通过模拟顾客逐一购买商品的过程,帮助我们实现最优商品售出策略。

学习建议

  • 数据结构的运用:在解决这类问题时,掌握如何使用字典、列表等数据结构是非常重要的,能帮助我们更高效地进行数据处理和查询。
  • 贪心算法:贪心算法常用于局部最优解可以导致全局最优解的场景。在本题中,贪心地将顾客想要的商品放到前面,使得每个顾客能够尽早找到商品。
  • 刷题技巧:在刷题过程中,建议记录自己的思考过程并进行总结,不仅要解题,还要理解题目背后的算法思想。