问题描述
小C来到了一家餐馆,准备点一些菜。
已知该餐馆有 n 道菜,第 i道菜的售价为 wi。
小C准备点一些价格相同的菜,但小C不会点单价超过 m的菜。
小C想知道,自己最多可以点多少道菜?
测试样例
样例:
输入:
m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
输出:3
解决思路
要解决这个问题,我们需要找到价格不超过 m 的菜中,出现次数最多的那一道菜的次数。
- 过滤价格:首先,我们只考虑价格不超过
m的菜。 - 统计频率:然后,我们统计这些菜的价格出现的频率。
- 找出最大频率:最后,我们找出这些频率中的最大值。
具体思路
- 初始化一个字典:用于记录每种价格的出现次数。
- 遍历价格列表:对于每个价格,如果它小于等于
m,我们就在字典中更新它的计数。 - 找出最大值:遍历字典的值,找出最大的出现次数。
代码
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 的菜。具体来说,它统计了每种价格的菜出现的次数,并返回出现次数最多的那个价格的计数。
- 创建字典:我们使用一个字典
price_count来记录每种价格的出现次数。 - 遍历价格列表:对于每个价格,如果它小于等于 mm,我们就在字典中更新它的计数。如果该价格已经在字典中,则将其计数加一;否则,将其添加到字典中并初始化计数为一。
- 找出最大值:遍历字典的值,找出最大的出现次数。
经验总结
-
明确问题需求:
在开始编写代码之前,确保完全理解问题的需求和约束条件。这有助于避免在实现过程中出现偏差。
-
选择合适的数据结构:
使用字典来记录每种价格的出现次数是一个有效的选择,因为字典提供了快速的查找和更新操作。
-
逐步构建解决方案:
将问题分解为几个小步骤,如过滤价格、统计频率和找出最大值。这种方法不仅使问题更易于管理,还有助于调试和测试每个步骤。
-
考虑边界情况:
确保代码能够处理各种边界情况,例如空列表或所有价格都超过 m 的情况。
-
测试用例的重要性:
编写多个测试用例来验证代码的正确性,包括一些极端情况和普通情况。这有助于确保代码的健壮性和可靠性。
-
优化性能:
虽然当前的解决方案已经足够高效,但在处理非常大的数据集时,可以考虑进一步优化。例如,可以在一次遍历中同时完成过滤和计数。
-
代码可读性和维护性:
保持代码简洁明了,并添加必要的注释,以提高代码的可读性和维护性。这不仅有助于自己以后回顾代码,也方便他人阅读和理解。