题目描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a 和另外两张相同牌面值的牌 b。如果两个人同时拥有“葫芦”,我们会优先比较牌 a 的大小,若牌 a 相同则再比较牌 b 的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
解题思路
题目要求找出最大的“葫芦”,而“葫芦”有两个条件:
- 由三张相同的牌a和两张相同的牌b组成;
- 牌面之和不超过给定最大值max;
而且要注意:牌面的大小和牌面的数值不完全相等,其中A比其他牌大但数值为1!
因此,我的解题步骤如下:
1.数据处理
使用字典遍历牌组数组,以牌值为键、牌数为值添加入字典之中;
遍历字典,找出满足a牌(牌数大于等于3)和b牌的牌值(牌数大于等于2)并分别存入列表array_2和array_3中;若array_2或array_3为空,说明牌组里没有能够形成“葫芦”的牌组,输出“0,0”;
将array_2和array_3升序排序;
判断array_2和array_3是否含有1(牌A),若含有1,因为已经经过了升序排序,1必然会在索引为0位置;为满足A牌比其他牌都大的规则,将1从array_2和array_3列表首弹出并移至列表末尾;这里可以使用array_2.append(array_2.pop(0))或者我主体代码中切片更新的方式array_2=array_2[1:]+array_2[:1];
2.逆序比较
在完成数据处理后,获得的array_2和array_3就是a牌b牌可以形成“葫芦”的值,但要找出最大“葫芦”且满足一定条件,需要逆序遍历a、b组合,从理论最大“葫芦”逐步下降,找出满足题目要求的合适“葫芦”并输出对应的值;在这里题目有两个条件:
- 牌面值之和不超过给定最大值:
- 构成“葫芦”的a、b牌牌面不能相等。
要注意a牌的比较必须在b牌之前,在程序中体现在array_3的逆序遍历要在array_2之外!
```def solution(n, pmax, array):
# Edit your code here
count={}
for a in array:
if a in count:
count[a]=count[a]+1
else:
count[a]=1
array_2=[k for k,v in count.items() if v>=2]
array_3=[k for k,v in count.items() if v>=3]
if len(array_2)==0 or len(array_3)==0:
return [0,0]
else:
array_2.sort()
array_3.sort()
if array_2[0]==1:
array_2=array_2[1:]+array_2[:1]
if array_3[0]==1:
array_3=array_3[1:]+array_3[:1]
for j in range(1,len(array_3)+1):
for i in range(1,len(array_2)+1):
if array_2[-i]*2+array_3[-j]*3<=pmax \
and array_2[-i]!=array_3[-j]:
return [array_3[-j],array_2[-i]]
else:
continue
return [0, 0]
if __name__ == "__main__":
# Add your test cases here
print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5])
print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9])
print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0])