点菜问题 | 青训营X豆包MarsCode 技术训练营

26 阅读2分钟

问题描述

小C来到了一家餐馆,准备点一些菜。

已知该餐馆有 n 道菜,第 i 道菜的售价为 wi。

小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。

小C想知道,自己最多可以点多少道菜?


测试样例

样例1:

输入:m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
输出:3

样例2:

输入:m = 4, w = [1, 2, 4, 4, 4]
输出:3

样例3:

输入:m = 5, w = [5, 5, 5, 5, 6, 7, 8]
输出:4

解题思路

这个问题的目标是找出在给定的菜品价格列表中,最多能够点的同样价格的菜品数目,同时价格不能超过给定的最大单价 m

我们可以按照以下步骤来解决这个问题:

  1. 过滤价格: 首先,排除所有单价超过 m 的菜品,只考虑价格小于等于 m 的菜品。
  2. 统计出现次数: 统计每个价格出现的次数。
  3. 找到最大次数: 找出出现次数最多的价格,并返回这个次数。

代码实现

from collections import Counter

def solution(m: int, w: list) -> int:
    # 过滤出价格小于等于 m 的菜品
    filtered_prices = [price for price in w if price <= m]
    
    # 统计每个价格出现的次数
    price_counts = Counter(filtered_prices)
    
    # 返回出现次数最多的价格的数量
    return max(price_counts.values(), default=0)

if __name__ == '__main__':
    # 测试样例
    print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]) == 3)
    print(solution(4, [1, 2, 4, 4, 4]) == 3)
    print(solution(5, [5, 5, 5, 5, 6, 7, 8]) == 4)

解释

  1. 过滤价格: 使用列表推导式 [price for price in w if price <= m],只保留那些价格小于或等于 m 的菜品。

  2. 统计出现次数: Counter 是一个非常方便的工具,用来统计元素出现的频率。Counter(filtered_prices) 会生成一个字典,键是菜品的价格,值是该价格出现的次数。

  3. 找出最大次数: 使用 max(price_counts.values(), default=0) 找出出现次数最多的价格对应的次数。如果没有满足条件的菜品(即 filtered_prices 为空),default=0 可以避免出现错误,返回 0。

测试结果

对于给定的样例,程序输出正确的结果:

  • 第一个测试样例:3,即最多可以点 3 道价格为 6 的菜。
  • 第二个测试样例:3,即最多可以点 3 道价格为 4 的菜。
  • 第三个测试样例:4,即最多可以点 4 道价格为 5 的菜。