小C点菜问题|豆包MarsCode AI刷题

38 阅读3分钟

问题描述

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

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

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

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


测试样例

样例:

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

解决思路

要解决这个问题,我们需要找到价格不超过 m 的菜中,出现次数最多的那一道菜的次数。

  1. 过滤价格:首先,我们只考虑价格不超过 m 的菜。
  2. 统计频率:然后,我们统计这些菜的价格出现的频率。
  3. 找出最大频率:最后,我们找出这些频率中的最大值。

具体思路

  1. 初始化一个字典:用于记录每种价格的出现次数。
  2. 遍历价格列表:对于每个价格,如果它小于等于 m,我们就在字典中更新它的计数。
  3. 找出最大值:遍历字典的值,找出最大的出现次数。

代码

def solution(m: int, w: list) -> int:
    price_count = {}
    for price in w:
        if price <= m:
            if price in price_count:
                price_count[price] += 1
            else:
                price_count[price] = 1
    max_count = 0
    for count in price_count.values():
        if count > max_count:
            max_count = count
    return max_count
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)

代码解释

上述代码的目的是解决一个特定的问题:在给定的餐馆菜单中,找出小C最多可以点多少道价格不超过 m 的菜。具体来说,它统计了每种价格的菜出现的次数,并返回出现次数最多的那个价格的计数。

  1. 创建字典:我们使用一个字典 price_count 来记录每种价格的出现次数。
  2. 遍历价格列表:对于每个价格,如果它小于等于 mm,我们就在字典中更新它的计数。如果该价格已经在字典中,则将其计数加一;否则,将其添加到字典中并初始化计数为一。
  3. 找出最大值:遍历字典的值,找出最大的出现次数。

经验总结

  1. 明确问题需求

    在开始编写代码之前,确保完全理解问题的需求和约束条件。这有助于避免在实现过程中出现偏差。

  2. 选择合适的数据结构

    使用字典来记录每种价格的出现次数是一个有效的选择,因为字典提供了快速的查找和更新操作。

  3. 逐步构建解决方案

    将问题分解为几个小步骤,如过滤价格、统计频率和找出最大值。这种方法不仅使问题更易于管理,还有助于调试和测试每个步骤。

  4. 考虑边界情况

    确保代码能够处理各种边界情况,例如空列表或所有价格都超过 m 的情况。

  5. 测试用例的重要性

    编写多个测试用例来验证代码的正确性,包括一些极端情况和普通情况。这有助于确保代码的健壮性和可靠性。

  6. 优化性能

    虽然当前的解决方案已经足够高效,但在处理非常大的数据集时,可以考虑进一步优化。例如,可以在一次遍历中同时完成过滤和计数。

  7. 代码可读性和维护性

    保持代码简洁明了,并添加必要的注释,以提高代码的可读性和维护性。这不仅有助于自己以后回顾代码,也方便他人阅读和理解。