题解 | #扎金花# 充分利用字典序、数组和字符串比大小

扎金花

https://www.nowcoder.com/practice/f4e2fc37f9a54787a7c2846873e8b827

题目处的样例输入和输出没有换行,因此没法正确运行代码。以下为正确的输入示例(输出同样是每个数独占一行)

KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A

思路:

目的是比较两个牌的大小,为了简化比较方法,我们把牌型进行一系列转化,从而可以直接比较两组牌的大小。现在假设我们将手牌从小到大排好了顺序,可以用如下方式判断牌型,以及同样牌型的比较大小方式:

  • 如果最大牌 = 最小牌,则属于“豹子”牌型。直接比较其中一张的点数即可。
  • 如果中间牌 = 最大牌,或中间牌 = 最小牌,则属于“对子”牌型。需要先比较对子的点数,再比较另外一张点数。
  • 如果最大牌和最小牌点数差2,且不是对子,则属于“顺子”牌型。比较最大的牌点数即可。
  • 对于普通牌型,需要将牌从大到小排序,并依次比较大小

具体说来,模拟处理分为如下几步:

  1. 首先,分别将牌中的 10,J,Q,K,A 分别替换成字符 a, b, c, d, e(关键点一)。这样一来,由于字符 2-9 和 a-e 的ascii序数依次增大,可以让之后的排序和比较变得非常方便。顺便用正则表达式检查输入是否合法,若不合法则返回-2。
  2. 定义一个 help() 函数,传入的是排序好是手牌,返回值是一个数组。其中,数组的第一个元素为 0,1,2 ,3 之一,分别代表:豹子、顺子、对子、普通。数组的第二个元素为牌的点数。
  3. 因为数组优先比较靠前的元素(即优先比较牌型),字符串优先比较靠前的字符(即先比较最大的牌)(关键点二)。所以直接比较两组手牌的 help() 返回值即可。
from re import fullmatch
def solve():
    a, b = input().replace('10', 'a').replace('J', 'b').replace('Q', 'c').replace('K', 'd').replace('A', 'e').split()
    if not (fullmatch('[2-9a-e]{3}', a) and fullmatch('[2-9a-e]{3}', b)):
        return -2
    a, b = sorted(list(a)), sorted(list(b))
    if a == b:
        return 0
    return 1 if help(a) > help(b) else -1
def help(card):
    if card[0] == card[2]:
        return 3, card[0]
    elif card[1] == card[0]:
        return 1, card[1] + card[2]
    elif card[1] == card[2]:
        return 1, card[1] + card[0]
    elif '23456789abcde'.index(card[2]) - '23456789abcde'.index(card[0]) == 2:
        return 2, card[0]
    else:
        return 0, ''.join(card[::-1])
while 1:
    try:
        print(solve())
    except EOFError:
        break

全部评论

相关推荐

2025-11-20 20:09
门头沟学院 UE5
秋招正式结束,终于拿到满意的offer了,还是自己想干的游戏客户端开发,算是入了游戏行业的行(不过我还是坚定的劝退游戏行业),也算是给自己四年里玩了三年的大学生活一个交代。回想一下大学生涯,刚进大学的时候因为学历问题想选择了考研,所以大一大二基本是纯玩过去的,结果大二暑假了解到了国内研究生的牛马现状,害怕自己到时候不是跳了就是跟导师爆了,又选了就业这条路。大二暑假到大三说是开始学技术了,其实也没怎么好好学,还是在边学边玩的状态,到了大三下找暑假实习的时候,项目项目不行,八股八股不会,所以暑假实习根本没敢投简历。说起来好笑,我开始认真学技术的转折应该是大三下开始看地下偶像,有一个北京的团来郑州远征,认识了两个很好的偶像,萌生了想要去北京工作,这样周周都能看地下偶像的想法。这样一直学到了七月中旬,开始在boss上投简历。结果因为我学的是ue,小厂基本没有,大厂又不敢投,即使之前有一点unity的经验也不熟,导致约面很少,即使约面了也过不了。运气很好的是,有一家武汉的小厂在我不会unity的情况下也收留了我,虽然在这家实习的经历不怎么愉快,干的也是纯dirty work,但公司的氛围还不错,也给了我带薪学习,熟悉项目背八股的机会。我想说的是实习真的很重要,有了实习约面的机会就大很多,我也在实习一段时间后开始继续投简历,也有了一些中大厂的约面,虽然基本还是一面挂,但总之还是在不断面试不断复盘中学到很多,也有一些很好的面试官在面试中会引导和讲解,虽然也有一些很烂的面试官。转折大概在这个月初吧,在这之前我一直都是备战春招了,面试最远的走到了hr面之后的横向,最后横向挂了,然后收到了现在这家公司的面试,当时根本没想着面试能通过,抱着试一试的心态,结果问的东西基本都会,流程很快,稀里糊涂的两轮技术面一轮hr面都过了,从约面到发offer只用了三周。回想自己这一路,也是有些戏剧性。当初那个让我学技术卷出来的动力,就是想去北京,想周周都能见到想见的小偶像。结果现在拿到offer了,去的是上海;支撑我走过来的两位小偶像,一个已经毕业了,一个下个月也要毕业了。就这样吧,下个月去北京看她的毕业sp,然后去上海实习提前感受一下,希望能顺利吧。
致无瑕之人:我也是双非小本科,十月份也在一家小公司入职实习了,目前也打算春招冲一下大厂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务