伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题

20 阅读4分钟

最近在参加豆包的AI刷题活动,深感慨如今AI的解题能力这么强了,不过可能还是会有些小细节有问题,这里将对一些问题做出解析。

先来看看这道题

9.超市里的货物架调整

问题描述

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

首先进行问题分析

问题分析

首先,我们需要理解题目的核心要求。题目中给出了几个关键信息:

  • 货物架的格子数 n
  • 顾客想要购买的商品种类数 m
  • 货物架上商品的初始顺序 s
  • 顾客想要购买的商品种类 c

我们的目标是重新安排商品顺序,使得顾客在查找过程中尽可能早地找到他们想要购买的商品。这意味着我们应该将顾客需求量大的商品放在前面。

关键思路

  1. 统计商品频率:首先,我们需要统计货物架上每种商品的频率,以及顾客想要购买的商品的频率。
  2. 排序商品:根据顾客的需求量,对商品进行排序。需求量大的商品应该排在前面。
  3. 计算最大销售量:按照排序后的商品顺序,计算最大销售量。对于每种商品,我们取其在货物架上的数量和顾客需求量中的较小值,然后累加到销售量中。

代码实现

  1. 统计商品频率
product_count = {}
for char in s:
    product_count[char] = product_count.get(char, 0) + 1

demand_count = {}
for char in c:
    demand_count[char] = demand_count.get(char, 0) + 1

这里,我们使用 Python 字典来统计每种商品的频率。product_count 存储货物架上每种商品的频率,而 demand_count 存储顾客想要购买的商品的频率。

  1. 按需求量排序商品
sorted_products = sorted(products, key=lambda x: demand_count.get(x, 0), reverse=True)

这里,我们使用 Python 的 sorted 函数和一个 lambda 函数来根据顾客的需求量对商品进行排序。reverse=True 参数确保需求量大的商品排在前面。

  1. 计算最大销售量
sold = 0
for product in sorted_products:
    if product in demand_count:
        sold += min(product_count[product], demand_count[product])
        del demand_count[product]

这里,我们遍历排序后的商品列表,并更新销售量。对于每种商品,我们取其在货物架上的数量和顾客需求量中的较小值,然后累加到销售量中。如果某种商品在货物架上的数量大于顾客的需求量,我们只需要考虑顾客的需求量。如果某种商品在货物架上的数量小于或等于顾客的需求量,我们需要考虑商品在货物架上的数量。

完整代码

def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计每个商品的频率
    product_count = {}
    for char in s:
        product_count[char] = product_count.get(char, 0) + 1

    # 统计顾客需求的商品频率
    demand_count = {}
    for char in c:
        demand_count[char] = demand_count.get(char, 0) + 1

    # 获取所有商品的键
    products = list(product_count.keys())

    # 按需求量从高到低排序商品
    sorted_products = sorted(products, key=lambda x: demand_count.get(x, 0), reverse=True)

    # 计算最大销售量
    sold = 0
    for product in sorted_products:
        if product in demand_count:
            sold += min(product_count[product], demand_count[product])
            del demand_count[product]

    return sold

总结分析

这个超市货物架商品排序问题的算法具有线性时间复杂度 O(n + m) 和常数空间复杂度 O(1)。这意味着算法的效率很高,适用于处理大量数据的情况。