问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌a和另外两张相同牌面值的牌b。如果两个人同时拥有“葫芦”,我们会优先比较牌a 的大小,若牌a 相同则再比较牌b 的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
问题理解
我们需要在一个给定的牌组中找到一个“葫芦”组合,该组合由三张相同牌面值的牌a和两张相同牌面值的牌 b 组成。同时,这个组合的牌面值之和不能超过给定的最大值max。如果存在多个符合条件的“葫芦”组合,我们需要选择牌面值最大的组合。
算法步骤
- 频率统计:遍历牌组,统计每种牌面值的出现次数,并存储在HashMap 中。
- 找出三张相同牌面值的组合:遍历HashMap ,找出所有出现次数大于等于3的牌面值,并将它们存储在一个List 中。
- 排序:对三张相同牌面值的组合进行降序排序,以便优先考虑牌面值较大的组合。
- 找出两张相同牌面值的组合:对于每一个三张相同牌面值的组合,再次遍历HashMap ,找出所有出现次数大于等于2且与当前三张相同牌面值不同的牌面值,并将它们存储在一个List中。
- 再次排序:对两张相同牌面值的组合进行降序排序,以便优先考虑牌面值较大的组合。
- 计算和判断:对于每一个可能的“葫芦”组合,计算其牌面值之和,并判断是否不超过给定的最大值max。如果符合条件,则返回该组合。
- 返回结果:如果没有找到符合条件的“葫芦”,则返回[0,0]。