当前位置: 首页 > 面试经验 >

【华为OD机试2023】整理扑克牌Python

优质
小牛编辑
97浏览
2023-03-28

【华为OD机试2023】整理扑克牌Python

题目描述:

给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理:

步骤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)

 类似资料: