HUAWEI机试:最长的顺子

https://blog.csdn.net/Muse_God/article/details/125354063

希望有更好的解法

题目描述

斗地主起源于湖北十堰房县,据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上。
牌型:
单顺,又称顺子,最少5张牌,最多12张牌(3…A)不能有2,也不能有大小王,不计花色。
例如:
3-4-5-6-7-8,7-8-9-10-J-Q,3-4-5-6-7-8-9-10-J-Q-K-A
可用的牌 3<4<5<6<7<8<9<10<J<Q<K<A<2<B(小王)<C(大王),每种牌除大小王外有四种花色
(共有13×4+2张牌)

输入描述

输入的第一行为当前手中的牌
输入的第二行为已经出过的牌(包括对手出的和自己出的牌)

输出描述

最长的顺子
对手可能构成的最长的顺子(如果有相同长度的顺子,输出牌面最大的那一个),
如果无法构成顺子,则输出 NO-CHAIN。

示例

示例1
输入
3-3-3-4-4-5-5-6-7-8-9-10-J-Q-K-A-A-A-A
4-5-6-7-8-8-8
输出
9-10-J-Q-K

示例2
输入
3-3-3-3-8-8-8-8
K-K-K-K
输出
NO-CHAIN
说明
剩余的牌无法构成顺子

在此记录:机试时因为大意,少写了等号,导致通过率83.3%,加上等号应该可以100%通过

# 字典存储扑克
# 可用的牌 3<4<5<6<7<8<9<10<J<Q<K<A<2<B(小王)<C(大王)
porker_num = {'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':11,'Q':12,'K':13,'A':14,'2':15,'B':16,'C':17}
porker_str = {3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9',10:'10',11:'J',12:'Q',13:'K',14:'A',15:'2',16:'B',17:'C'}

# 所有的扑克
porker = []
lst = list(porker_num.values())
for i in range(4):
    porker.extend(lst[:-2])
porker.extend(lst[-2:])
porker.sort()
# print(porker)

# 将自己的和已出的转换成数字
input_have = list(porker_num.get(k) for k in input().upper().split('-')) # 注意大小写转换
input_lost = list(porker_num.get(k) for k in input().upper().split('-'))
# print(input_lost)
# print(input_have)
temp = input_have + input_lost
# print(temp)

# 找到剩余的牌
for j in range(len(temp)):
    if temp[j] in porker:
        porker.remove(temp[j])
remain_porker = list(set(porker))

# 去掉2和大小王
if 15 in remain_porker:
    remain_porker.remove(15)
if 16 in remain_porker:
    remain_porker.remove(16)
if 17 in remain_porker:
    remain_porker.remove(17)
# print(remain_porker)

# 找最长子串
def max_length(remain_porker,porker_str):
    result = []
    temp_res = []
    i = 1
    temp_res.append(remain_porker[0])
    while i < len(remain_porker):
        if remain_porker[i]-1 == remain_porker[i-1]:
            temp_res.append(remain_porker[i])
            i += 1
        else:
            if len(temp_res) >= len(result): 
            # 等号不可省略,因为长度相等时,输出最大的子串;
            # 因为porker已经排序了,最大子串总在后面
                result = temp_res[:]
            temp_res.clear()
            temp_res.append(remain_porker[i])
            i += 1
    if len(temp_res) >= len(result): 
    # 等号不可省略,因为长度相等时,输出最大的子串;
    # 因为porker已经排序了,最大子串总在后面
        result = temp_res[:]
    if 5 <= len(result) <= 12:
        s = '-'.join([porker_str[j] for j in result])
        return s
    else:
        return 'NO-CHAIN'
print(max_length(remain_porker,porker_str))
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值