华为校招上机笔试题:扑克牌大小比较算法解析(Python实现)
本文详细解析华为校园招聘上机笔试题中的“扑克牌大小”问题。题目要求比较两手牌的大小,涉及单张、对子、顺子、三个、炸弹及对王等多种牌型。文章提供了完整的Python解题思路与代码,重点讲解如何判断牌型、处理特殊规则(如炸弹和对王优先级)以及输出较大牌或ERROR。适合准备华为校招及Python算法练习的开发者参考。
本文分享了华为校园招聘上机考试中的一道经典编程题目,供广大求职者参考学习。
题目描述与规则
[编程题] 扑克牌大小 时间限制:10秒 空间限制:131072K 扑克牌游戏是大家熟悉的娱乐项目,一副标准扑克牌共54张,包含从3到A的各4张,以及小王1张和大王1张。 牌面大小用以下字符或字符串表示(小写joker代表小王,大写JOKER代表大王): 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入格式为两手牌,中间用“-”连接,每手牌内的每张牌以空格分隔,且“-”两侧无空格。例如:4 4 4 4-joker JOKER 要求比较两手牌的大小,输出较大的那手牌;若无法比较(类型不匹配且非特殊牌型),则输出ERROR。
基本规则说明:
(1)每手牌只能是单张、对子、顺子(连续5张)、三个、炸弹(四张)或对王中的一种,不存在其他复杂组合。输入保证两手牌均合法,且顺子已按从小到大排序。 (2)除炸弹和对王外,其他牌型只能与相同类型的牌进行比较(如对子比对子,三个比三个),不允许拆牌比较(例如不能将对子拆成单张)。 (3)大小判定遵循常见规则:单张、对子、三个比较牌面数值;顺子比较最小牌的数值;炸弹大于所有非炸弹牌型,炸弹之间比较牌面数值;对王(joker JOKER)为最大牌型。 (4)输入的两手牌不会出现完全相等的情况。
解题关键点提示:
(1)除炸弹和对王外,其他牌型必须类型相同才能比较。 (2)题目已保证输入牌的合法性,无需额外校验输入格式。 (3)输入的顺子已按从小到大排列,无需再次排序。
输入描述:
输入两手牌,中间用“-”连接,每手牌内每张牌以空格分隔,例如:4 4 4 4-joker JOKER。
输出描述:
输出两手牌中较大的一手,不含连接符,牌面顺序不变,仍以空格分隔;若无法比较,则输出ERROR。
输入例子1:
4 4 4 4-joker JOKER
输出例子1:
joker JOKER '''
Python代码实现
''' 解题思路:细心分析 华为笔试题目通常逻辑清晰,无需过度复杂思考,关键在于仔细分析各种牌型及其比较规则,即可顺利解决。
''' 代码运行结果: 答案正确:恭喜!您提交的程序通过了所有的测试用例
def judge_token(cs):
length = len(cs)
if length == 1:
return 'single'
elif length == 3:
return 'triple'
elif length == 4:
return 'bomb'
elif length == 5:
return 'seq'
elif length == 2:
if cs == ['joker', 'JOKER']:
return 'j-bomb'
else:
return 'double'
card_dict = {'3': 1, '4': 2, '5': 3, '6': 4, '7': 5, '8': 6, '9': 7, '10': 8, 'J': 9, 'Q': 10, 'K': 11,
'A': 12, '2': 13, 'joker': 14, 'JOKER': 15}
while True:
try:
cards = input().split('-')
cards_1 = cards[0].split()
cards_2 = cards[1].split()
cards_1_token = judge_token(cards_1)
cards_2_token = judge_token(cards_2)
if cards_1_token != 'bomb' and cards_1_token != 'j-bomb' and cards_2_token != 'bomb' and cards_2_token != 'j-bomb':
if cards_1_token == cards_2_token:
if card_dict[cards_1[0]] > card_dict[cards_2[0]]:
print(' '.join(cards_1))
else:
print(' '.join(cards_2))
else:
print('ERROR')
elif (cards_1_token == 'bomb' or cards_1_token == 'j-bomb') and (cards_2_token != 'bomb' and cards_2_token != 'j-bomb'):
print(' '.join(cards_1))
elif (cards_1_token != 'bomb' and cards_1_token != 'j-bomb') and (cards_2_token == 'bomb' or cards_2_token == 'j-bomb'):
print(' '.join(cards_2))
elif cards_1_token == 'bomb' and cards_2_token == 'j-bomb':
print(' '.join(cards_2))
elif cards_1_token == 'j-bomb' and cards_2_token == 'bomb':
print(' '.join(cards_1))
else:
if card_dict[cards_1[0]] > card_dict[cards_2[0]]:
print(' '.join(cards_1))
else:
print(' '.join(cards_2))
except:
以上就是本文的全部内容,希望对大家的学习有所帮助,也欢迎大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













