伴学笔记6

165 阅读4分钟

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

问题描述

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

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:

  • 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

问题理解

在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品。顾客会依次查找这些格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。

数据结构选择

  1. 字典:使用字典来记录每个商品在货架上的位置,这样可以快速查找商品的位置。
  2. 标记数组:使用一个标记数组来记录每个格子中的商品是否已经被购买。

算法步骤

  1. 记录商品位置:遍历货架上的商品,使用字典记录每个商品的位置。

  2. 初始化标记数组:创建一个长度为 n 的标记数组,初始值为 False,表示所有商品都未被购买。

  3. 遍历顾客想要的商品:对于每个顾客想要的商品,检查其在货架上的位置:

    • 如果该商品在货架上且未被购买,则将其标记为已购买,并增加结果计数。
  4. 返回结果:最终返回结果计数,即最多可以卖出的商品数量。

思路总结

  1. 使用字典记录商品位置:这样可以快速查找商品的位置,避免内层循环。
  2. 标记数组记录购买状态:使用标记数组来记录每个格子中的商品是否已经被购买。
  3. 贪心策略:优先将顾客最想要的商品放在前面,这样可以最大化地卖出商品。

关键步骤解释

  1. 字典记录位置:使用字典 position 记录每个商品在货架上的位置,这样可以快速查找商品的位置。
  2. 标记数组:仍然使用 flag 数组来标记商品是否已经被购买。
  3. 遍历顾客想要的商品:直接通过字典查找商品的位置,避免了内层循环,提高了效率。

注意每个字符只允许匹配一次,成功匹配后break

python
 代码解读
复制代码
def solution(n: int, m: int, s: str, c: str) -> int:
    # write code here
    result = 0
    flag = [False] * n
    for i in range(len(c)):
        for j in range(len(s)):
            if c[i] == s[j] and flag[j] is False:
                result += 1
                flag[j] = True
                break
    return result

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. 双层循环:当前代码使用了双层循环来遍历顾客想要的商品种类 c 和货架上的商品 s。这种做法的时间复杂度是 O(n * m),其中 n 是货架上的商品数量,m 是顾客想要的商品种类数。
  2. 标记数组:使用了一个 flag 数组来标记货架上的商品是否已经被购买。

改进提示

  1. 优化循环:可以考虑使用字典来记录每个商品在货架上的位置,这样可以在 O(1) 时间内找到某个商品的位置,从而减少内层循环的次数。
  2. 贪心策略:在调整商品顺序时,可以优先将顾客最想要的商品放在前面,这样可以最大化地卖出商品。