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

66 阅读3分钟

问题描述

我们需要设计一种策略来优化超市货架上商品的排列顺序,使得顾客能够最大化购买商品。在调整商品顺序之后,第一个顾客会依次从第一个格子查找到最后一个格子,寻找自己想要购买的商品。

需要注意以下几点:

  1. 初始输入

    • n:货物架格子的数量。
    • m:顾客想要购买的商品种类数量。
    • s:货物架上商品的初始顺序。
    • c:顾客想要购买的商品种类。
  2. 输出

    • 最多可以卖出的商品数量。
  3. 规则

    • 我们可以重新调整货架上的商品顺序,但必须优先考虑满足顾客需求。
    • 一旦调整完毕,在顾客完成一次购买后,货物架的顺序固定,无法更改。

数据结构

在问题中,需要解决以下两类需求:

  1. 需求匹配:跟踪顾客想要的商品及其购买意愿。

    • 使用字典 demand 来统计每种商品的购买需求数量。
  2. 商品重新排序:优先满足顾客需求的商品排列到前面。

    • 使用排序操作,通过顾客需求量对货架商品重新排列。

算法步骤

  1. 统计顾客需求

    • 创建一个字典 demand,存储每种商品的需求数量。
    • 遍历顾客需求 c,统计每种商品的需求数量。
  2. 重新排序货架

    • 使用商品需求量作为排序依据,调整货架 s 的排列顺序。
  3. 模拟销售过程

    • 遍历排序后的货架,检查商品是否在顾客的需求列表中。
    • 如果该商品有需求,则记录一次成功售出,并减少需求数量。
  4. 返回结果

    • 返回成功售出的商品数量。

完整代码

以下是基于上述思路实现的 Python 代码:

def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计顾客的需求数量
    demand = {}
    for item in c:
        if item in demand:
            demand[item] += 1
        else:
            demand[item] = 1
    
    # 按需求量重新排列货架商品
    sorted_s = sorted(s, key=lambda x: demand.get(x, 0), reverse=True)
    
    # 模拟销售
    sold = 0
    for item in sorted_s:
        if demand.get(item, 0) > 0:
            sold += 1
            demand[item] -= 1
    
    return sold

# 测试代码
if __name__ == '__main__':
    print(solution(3, 4, "abc", "abcd") == 3)  # 样例1
    print(solution(4, 2, "abbc", "bb") == 2)  # 样例2
    print(solution(5, 4, "bcdea", "abcd") == 4)  # 样例3

测试分析

测试样例 1

输入

n = 3, m = 4, s = "abc", c = "abcd"

分析

  • 顾客需求为 a, b, c, d
  • 超市商品为 a, b, c,重新排序后仍为 abc
  • 最多卖出商品为 a, b, c 共 3 件。

输出

3

测试样例 2

输入

n = 4, m = 2, s = "abbc", c = "bb"

分析

  • 顾客需求为 b, b
  • 超市商品为 a, b, b, c,重新排序后为 b, b, a, c
  • 最多卖出商品为 b, b 共 2 件。

输出

2

测试样例 3

输入

n = 5, m = 4, s = "bcdea", c = "abcd"

分析

  • 顾客需求为 a, b, c, d
  • 超市商品为 b, c, d, e, a,重新排序后为 b, c, d, a, e
  • 最多卖出商品为 b, c, d, a 共 4 件。

输出

4

个人总结

  • 算法优点

    1. 使用字典高效统计商品需求。
    2. 通过排序优化顾客优先需求的商品位置。
  • 时间复杂度

    • 统计需求:O(m)O(m)。
    • 排序货架:O(nlog⁡n)O(n \log n)。
    • 遍历售卖:O(n)O(n)。
    • 总复杂度为 O(nlog⁡n+m)O(n \log n + m)。
  • 适用场景

    • 适用于优化有限资源分配的问题,尤其是需求和资源间存在映射关系时。