题目描述: 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 和另外两张相同牌面值的牌 。如果两个人同时拥有“葫芦”,我们会优先比较牌 的大小,若牌 相同则再比较牌 的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
输入:
n: 牌的数量max: 牌面值之和的最大值array: 牌的列表
输出:
- 符合条件的最大“葫芦”组合,返回其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出
[0, 0]。
解题思路
-
统计每种牌面值的数量:
- 使用
defaultdict来统计每种牌面值的数量。defaultdict是一个非常有用的工具,特别是在需要频繁初始化新键的场景中。它可以帮助我们避免手动检查键是否存在,并减少KeyError的发生。
- 使用
-
遍历所有可能的三张相同牌面值的组合:
- 对于每个可能的三张相同牌面值的组合,检查是否存在符合条件的两张相同牌面值的组合。这一步通过嵌套循环来实现,外层循环遍历所有可能的三张相同牌面值的组合,内层循环遍历所有可能的两张相同牌面值的组合。
-
计算总和并更新最大组合:
- 计算三张相同牌面值和两张相同牌面值的总和,如果总和不超过
max,则更新最大组合。这一步通过比较当前组合的总和与之前找到的最大组合的总和来实现。
- 计算三张相同牌面值和两张相同牌面值的总和,如果总和不超过
-
返回结果:
- 如果没有找到符合条件的组合,返回
[0, 0];否则返回最大组合。
- 如果没有找到符合条件的组合,返回
代码实现
关键点总结
-
数据结构的选择:
- 使用
defaultdict来统计每种牌面值的数量,简化了代码并提高了效率。
- 使用
-
嵌套循环的使用:
- 通过嵌套循环遍历所有可能的三张相同牌面值和两张相同牌面值的组合,确保不会遗漏任何可能的组合。
-
条件判断与更新:
- 在计算总和并更新最大组合时,通过条件判断确保只更新符合条件的最大组合。
-
测试用例的设计:
- 设计了多个测试用例来验证代码的正确性,包括正常情况和边界情况。
总结
这道题目要求我们在给定的牌中找到符合条件的最大“葫芦”组合。通过统计每种牌面值的数量,遍历所有可能的三张相同牌面值的组合,并计算总和,我们可以找到符合条件的最大组合。代码实现中使用了 defaultdict 来简化统计过程,并通过嵌套循环来遍历所有可能的组合。
测试过程中,再补充A大于K的特殊情况,逐次进行修改,优化后完成题目。
希望这篇笔记对你理解这道题目和代码实现有所帮助