使用Python双指针写了一个跑得快找所有顺子算法

这段代码主要实现了一个寻找扑克牌中所有能与特定牌组构成顺子的子序列的功能。通过双指针技巧,首先对扑克牌进行排序,然后将较小指针移动到能开始顺子的位置,接着不断扩展顺子直到达到特定长度或无法扩展。这个算法适用于解决扑克牌游戏中的特定策略问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def get_all_shun_zi(out_cards=[1, 2, 3, 4, 5], p_cards=[1, 3, 4, 5, 6, 7, 2, 6, 4, 5, 6, 7, 8, 9, 10]):
    """
        双指针
        去p_cards里面找到所有能大于out_cards的顺子
    """
    # 去重
    s = set(p_cards)
    p_cards = list(s)

    min_card = min(out_cards)
    out_card_len = len(out_cards)
    p1 = 0
    p_cards.sort()
    # 将p1移到顺子的最小位置
    for i, v in enumerate(p_cards):
        if v > min_card:
            p1 = i
            break

    shun_zi = [p_cards[p1]]
    ans = []
    p_cards_len = len(p_cards)
    print("===", p_cards_len, p1, out_card_len, p_cards_len - p1 <= out_card_len)
    p2 = p1
    while p_cards_len - p2 >= out_card_len:
        # 符合要得起的顺子,直接加入答案
        if len(shun_zi) == out_card_len:
            ans.append(shun_zi)
            p2 += 1
            shun_zi = [p_cards[p2]]
            p1 = p2
            continue
        if p_cards[p1] + 1 == p_cards[p1 + 1]:
            shun_zi.append(p_cards[p1 + 1])
        else:
            shun_zi = [p_cards[p1 + 1]]
            p2 = p1 + 1
        p1 += 1
    return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值