伴学笔记 小C点菜问题 | 豆包MarsCode AI刷题

58 阅读2分钟

一、题目解析

题目描述
小C想在餐馆点一些价格相同的菜,但有两个限制条件:

  1. 菜品单价不能超过 m
  2. 目标是点最多数量的相同价格的菜。

我们需要返回小C最多能点多少道菜。

思路梳理

  1. 数据过滤:

    • 首先剔除单价超过 m 的菜,因为这些菜不能被点。
  2. 统计频率:

    • 对过滤后的价格列表统计每种价格的出现次数,找到出现次数最多的价格。
  3. 结果返回:

    • 输出出现次数最多的菜品数量。

代码详解

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)

二、知识总结

  1. 使用 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})
    
  2. 列表推导式的高效过滤:

    • 通过列表推导式可以快速过滤符合条件的元素:

      python
      
      filtered_w = [price for price in w if price <= m]
      
  3. 处理边界情况:

    • 当所有菜的价格都大于 m 时,Countermax 方法会返回 default=0,确保代码健壮性。

对其他入门同学的建议:

  • 学会使用 Countermax 方法,可以帮助快速解决统计类问题。
  • 注意边界条件处理,比如空列表的情况。

三、学习计划

  1. 小题练习:

    • 每天完成 2 道类似的基础题目,熟练使用 Python 的内置工具如 Countermax 等。
    • 在完成题目后,整理代码并尝试优化。
  2. 总结规律:

    • 针对高频算法模式(如统计频率、排序等)总结通用解决方案。
  3. 错题分析:

    • 对于写错的代码,记录并标记,定期复盘原因。

四、工具运用

  1. 借助豆包MarsCode AI:

    • 使用 AI 自动分析错题并提供解题提示,节省思考时间。
  2. 结合文档学习:

    • 配合 Python 官方文档,深入理解 collections 和其他工具模块的使用。

五、总结

小C点菜问题属于基础统计类问题,关键在于熟练使用 Python 工具和对边界条件的细致处理。通过不断刷题和总结,可以快速提升对类似问题的解决能力。