一、题目解析
题目描述
小C想在餐馆点一些价格相同的菜,但有两个限制条件:
- 菜品单价不能超过
m; - 目标是点最多数量的相同价格的菜。
我们需要返回小C最多能点多少道菜。
思路梳理
-
数据过滤:
- 首先剔除单价超过
m的菜,因为这些菜不能被点。
- 首先剔除单价超过
-
统计频率:
- 对过滤后的价格列表统计每种价格的出现次数,找到出现次数最多的价格。
-
结果返回:
- 输出出现次数最多的菜品数量。
代码详解
from collections import Counter
def solution(m: int, w: list[int]) -> int:
# 过滤掉价格大于 m 的菜品
filtered_w = [price for price in w if price <= m]
# 统计每个价格的出现次数
price_counts = Counter(filtered_w)
# 返回出现次数最多的菜品数量
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)
二、知识总结
-
使用
collections.Counter统计频率:Counter是 Python 中的一个强大工具,用于快速统计列表中每个元素的出现次数。
示例:
python from collections import Counter example = [1, 2, 2, 3, 3, 3] print(Counter(example)) # 输出:Counter({3: 3, 2: 2, 1: 1}) -
列表推导式的高效过滤:
-
通过列表推导式可以快速过滤符合条件的元素:
python filtered_w = [price for price in w if price <= m]
-
-
处理边界情况:
- 当所有菜的价格都大于
m时,Counter的max方法会返回default=0,确保代码健壮性。
- 当所有菜的价格都大于
对其他入门同学的建议:
- 学会使用
Counter和max方法,可以帮助快速解决统计类问题。 - 注意边界条件处理,比如空列表的情况。
三、学习计划
-
小题练习:
- 每天完成 2 道类似的基础题目,熟练使用 Python 的内置工具如
Counter、max等。 - 在完成题目后,整理代码并尝试优化。
- 每天完成 2 道类似的基础题目,熟练使用 Python 的内置工具如
-
总结规律:
- 针对高频算法模式(如统计频率、排序等)总结通用解决方案。
-
错题分析:
- 对于写错的代码,记录并标记,定期复盘原因。
四、工具运用
-
借助豆包MarsCode AI:
- 使用 AI 自动分析错题并提供解题提示,节省思考时间。
-
结合文档学习:
- 配合 Python 官方文档,深入理解
collections和其他工具模块的使用。
- 配合 Python 官方文档,深入理解
五、总结
小C点菜问题属于基础统计类问题,关键在于熟练使用 Python 工具和对边界条件的细致处理。通过不断刷题和总结,可以快速提升对类似问题的解决能力。