题目描述:
给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理:
步骤1、对扑克牌进行分组,形成组合牌,规则如下:
当牌面数字相同张数大于等于4时,组合牌为“炸弹”;
3张相同牌面数字 + 2张相同牌面数字,且3张牌与2张牌不相同时,组合牌为“葫芦”;
3张相同牌面数字,组合牌为“三张”;
2张相同牌面数字,组合牌为“对子”;
剩余没有相同的牌,则为“单张”;
步骤2、对上述组合牌进行由大到小排列,规则如下:
不同类型组合牌之间由大到小排列规则:“炸弹” > "葫芦" > "三张" > "对子" > “单张”;
相同类型组合牌之间,除“葫芦”外,按组合牌全部牌面数字加总由大到小排列;
“葫芦”则先按3张相同牌面数字加总由大到小排列,3张相同牌面数字加总相同时,再按另外2张牌面数字加总由大到小排列;
由于“葫芦”>“三张”,因此如果能形成更大的组合牌,也可以将“三张”拆分为2张和1张,其中的2张可以和其它“三张”重新组合成“葫芦”,剩下的1张为“单张”
步骤3、当存在多个可能组合方案时,按如下规则排序取最大的一个组合方案:
依次对组合方案中的组合牌进行大小比较,规则同上;
当组合方案A中的第n个组合牌大于组合方案B中的第n个组合牌时,组合方案A大于组合方案B;
输入描述:
第一行为空格分隔的N个正整数,每个整数取值范围[1,13],N的取值范围[1,1000]
输出描述:
经重新排列后的扑克牌数字列表,每个数字以空格分隔
示例1
输入:
1 3 3 3 2 1 5
输出:
3 3 3 1 1 5 2
示例2
输入:
4 4 2 1 2 1 3 3 3 4
输出:
4 4 4 3 3 2 2 1 1 3
解题思路:
机试考到了这题,但之前刷题时觉得太复杂,没细想,所以机试时一看到就慌了,最后没做出来。
现在复盘重做,不保证AC,也没做优化,仅供参考
(1)只考虑一副牌的情况,即每张牌最多4张。如果有多副牌的话,那我这5个while循环肯定是不够的了
(2)炸弹最大,把有4张的牌按照降序,全部加到res里
(3)其次是葫芦,葫芦有三种情况:①3张的牌有两个(或以上) ②3张的牌有两个(或以上),且有2张的牌 ③3张的牌只有一个,且有2张的牌。不论什么情况,先把3张的牌里,数字最大的那个加到res里,并把这个数字pop出来丢掉(事先把3张的牌,降序排列)
然后找出(可能还有的)3张的牌,以及(可能有的)2张的牌里,数字最大的那个,作为葫芦中的一对,加到res里,这里需要注意,如果这个数字原本是有3张的,那么需要在pop之后,把这个数字加到1张的牌的列表中
(4)处理玩葫芦后,如果还有3张的牌,那么就继续按照数字大小加到res里,之后的一对、单张都没有复杂情况了,也是这个流程
lst=list(map(int,input().split()))
dict={}
res=[]
#把所有牌按照张数分类存到字典里,只考虑有一副牌的情况,即每张牌最多4张,如果不止一副牌的话,那复杂度也太高了,我把握不住
for num in set(lst):
cnt=lst.count(num)
if dict.get(cnt)==None:
dict[cnt]=[num]
else:
dict[cnt].append(num)
#如果有炸弹,把所有炸弹排进去
while dict.get(4) and dict[4]!=[]:
dict[4].sort(reverse=True)
while dict[4]:
res+=[dict[4][0]]*4
dict[4].pop(0)
#如果有葫芦,把最大的葫芦放进去,考虑拆三张的情况
while (dict.get(3)!=None and ((len(dict[3])>=2)) or (dict.get(3)!=None and dict.get(2)!=None and len(dict[3])>=1 and len(dict[2])>=1)):
dict[3].sort(reverse=True)
res+=[dict[3][0]]*3
dict[3].pop(0)
if dict.get(2)!=None:
dict[2].sort(reverse=True)
if dict[3]!=[] and dict[3][0]>dict[2][0]:
res+=[dict[3][0]]*2
if dict.get(1)!=None:
dict[1].append(dict[3][0])
else:
dict[1]=[dict[3][0]]
dict[3].pop(0)
else:
res += [dict[2][0]] * 2
dict[2].pop(0)
else:
res += [dict[3][0]] * 2
if dict.get(1) != None:
dict[1].append(dict[3][0])
else:
dict[1] = [dict[3][0]]
dict[3].pop(0)
#如果有三张(无葫芦),把三张加进去
while dict.get(3) and len(dict[3])>=1:
dict[3].sort(reverse=True)
while dict[3]!=[]:
res+=[dict[3][0]]*3
dict[3].pop(0)
#如果有一对,把一对加进去
while dict.get(2) and len(dict[2])>=1:
dict[2].sort(reverse=True)
while dict[2] != []:
res += [dict[2][0]] * 2
dict[2].pop(0)
#如果有单张,把单张加进去
while dict.get(1) and len(dict[1])>=1:
dict[1].sort(reverse=True)
while dict[1] != []:
res += [dict[1][0]] * 1
dict[1].pop(0)
print(res)