You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化DJ Wild扑克游戏中对子检测的if语句?优化时间复杂度

简化扑克手牌对子检测的实现方案

问题分析

原代码通过多次调用count()方法判断是否存在对子,不仅代码冗长,而且每次count()都会遍历整个cards列表,时间复杂度较高(O(m*k),m是牌面种类数,k是手牌元素总数)。同时原user()函数存在索引错误问题:循环中使用carddeck.remove(carddeck[i])会导致牌堆长度动态变化,后续索引指向的元素会错位。

优化方案

1. 修复手牌抽取逻辑

先修正user()函数的取牌逻辑,使用pop()方法从牌堆顶部取牌,避免索引错误:

def user(n):
    for _ in range(n):
        card = carddeck.pop(0)  # 从洗牌后的牌堆顶部抽取一张牌
        print("Player:", card[0], card[1])
        cards.append(card[0])
        cards.append(card[1])

2. 简化对子检测逻辑

方法一:利用集合去重特性

手牌中的牌面如果有重复,去重后的集合长度会小于原牌面列表长度,直接通过长度对比判断是否存在对子:

# 提取所有牌面(忽略花色,cards列表中偶数索引是牌面)
ranks = [cards[i] for i in range(0, len(cards), 2)]
has_pair = len(set(ranks)) < len(ranks)

if has_pair:
    print("You have a pair")
else:
    print("You don't have a pair")
方法二:使用collections.Counter统计次数

通过Counter一次性统计所有牌面的出现次数,再检查是否有次数等于2的情况:

from collections import Counter

# 提取所有牌面
ranks = [cards[i] for i in range(0, len(cards), 2)]
rank_counts = Counter(ranks)
# 检查是否存在出现次数为2的牌面
has_pair = any(count == 2 for count in rank_counts.values())

if has_pair:
    print("You have a pair")
else:
    print("You don't have a pair")

完整优化后代码

import random
import itertools
from collections import Counter

# 变量声明
ante = 0
bonus = 0
balance = 200
cards = []
hands0 = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
hands1 = ["Spade", "Club", "Diamond", "Heart"]

# 初始化牌堆
carddeck = list(itertools.product(hands0, hands1))
# 洗牌
random.shuffle(carddeck)

# 抽取n张牌的函数
def user(n):
    for _ in range(n):
        card = carddeck.pop(0)
        print("Player:", card[0], card[1])
        cards.append(card[0])
        cards.append(card[1])

user(5)

# 检测对子
ranks = [cards[i] for i in range(0, len(cards), 2)]
rank_counts = Counter(ranks)
has_pair = any(count == 2 for count in rank_counts.values())

print("You have a pair" if has_pair else "You don't have a pair")

内容的提问来源于stack exchange,提问作者J Bo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:50:32