问题描述
小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。
我们可以按照以下步骤来解决这个问题:
- 过滤价格: 首先,排除所有单价超过
m的菜品,只考虑价格小于等于m的菜品。 - 统计出现次数: 统计每个价格出现的次数。
- 找到最大次数: 找出出现次数最多的价格,并返回这个次数。
代码实现
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)
解释
-
过滤价格: 使用列表推导式
[price for price in w if price <= m],只保留那些价格小于或等于m的菜品。 -
统计出现次数:
Counter是一个非常方便的工具,用来统计元素出现的频率。Counter(filtered_prices)会生成一个字典,键是菜品的价格,值是该价格出现的次数。 -
找出最大次数: 使用
max(price_counts.values(), default=0)找出出现次数最多的价格对应的次数。如果没有满足条件的菜品(即filtered_prices为空),default=0可以避免出现错误,返回 0。
测试结果
对于给定的样例,程序输出正确的结果:
- 第一个测试样例:
3,即最多可以点 3 道价格为6的菜。 - 第二个测试样例:
3,即最多可以点 3 道价格为4的菜。 - 第三个测试样例:
4,即最多可以点 4 道价格为5的菜。