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

84 阅读4分钟

问题描述

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

问题分析

为了求解最优调整下最多出售商品量,需要考虑以下几点:

1.最优调整

2.计数

已知顾客会离开的两种情况:

  • 顾客中途遇到一个空格子
  • 查找完所有格子还没有找到想要的商品

在第二种情况下,受客观条件限制顾客没有买到想要的商品,而在第一种情况中很有可能顾客想要的商品在空格子之后存在,而由于商品摆放顺序考虑不周导致顾客流失,没能达成“出售最多商品”这个目的。

那如何避免第一种情况呢?

我们可以想到将先到的顾客想要的商品摆在最后,最后到的顾客想要的商品摆在最前面。

可是顺着这个思路,作者发现这题干有点问题,若是考虑第一种情况在样例2中,第一个顾客和第二个顾客都要买b种类货品。那这样摆在前面的b种类货品势必会被第一个顾客买走,而第二个顾客必然会遇到空格子。这与输出结果相悖。

因此我觉得应该是出题者考虑不周,这道题根本不用考虑调整商品顺序,只用对供求端分别计数即可,而后面代码测试成功也验证了我的猜想。

代码

def solution(n: int, m: int, s: str, c: str) -> int:
    
    from collections import Counter
    # 统计货架上每种商品的出现频率
    supply = Counter(s)
    # 统计顾客对每种商品的需求量
    demand=Counter(c)
    sell_num=0

    for item in demand:
        if item in supply:
            if supply[item]>demand[item]:
                sell_num+=demand[item]
            else:
                sell_num+=supply[item]
    return sell_num

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

collections.Counter 是 Python 标准库 collections 模块中的一个类,专门用于计数可哈希对象的出现次数。它是一个字典的子类,因此具有字典的所有方法和属性,同时提供了一些额外的功能来方便地进行计数操作。

知识点

Counter 的特点

  1. 继承自字典

    • Counter 继承自 Python 的 dict 类,因此它具有字典的所有方法和属性。
    • 你可以像访问字典一样访问 Counter 中的元素,例如 counter['a'] 会返回元素 'a' 的出现次数。
  2. 自动计数

    • Counter 会自动统计传入的可迭代对象中每个元素的出现次数,并将结果存储为键值对,其中键是元素,值是该元素的出现次数。
  3. 支持字典操作

    • 你可以使用字典的常见操作,如 keys()values()items() 等方法来访问 Counter 中的数据。
  4. 额外功能

    • Counter 提供了一些额外的功能,如 most_common() 方法,用于返回出现次数最多的元素及其计数。