中文解答:LeetCode如何判断随机抽取的扑克牌是否为顺子

本问题要解决的是如何判断随机抽取的五张扑克牌是否为顺子。首先我们需要了解什么是顺子:顺子指的是五张或更多的连续数字的牌。在扑克牌中,A可以表示1或14,而其他牌的面值与数字对应,且没有大小王(0)。

1. 排序数组

解决这个问题的一个简单方法是先对数组进行排序,这样我们就可以确定数组中连续的数字之间的间隔。排序后,我们可以依次遍历数组中的每个非0数字,判断它与下一个数字之间的间隔是否为1。同时,还需要注意,如果数组中有重复的数字,那么是无法组成顺子的。

def isStraight(nums):
    nums.sort()
    # 统计0的个数
    zero_count = nums.count(0)
    # 从非0数字开始判断连续性
    for i in range(zero_count, len(nums)-1):
        # 判断是否有重复数字
        if nums[i] == nums[i+1]:
            return False
        # 判断间隔是否为1
        while nums[i]+1 != nums[i+1]:
            # 补充0的个数减1
            if zero_count <= 0:
                return False
            nums[i] += 1
            zero_count -= 1
    return True

2. 不排序直接判断

上述方法需要对数组进行排序,但这样会增加时间复杂度。为了解决这个问题,我们可以使用集合来判断。假设没有重复的数字,我们可以通过判断最大值与最小值的差值是否小于等于4来判断是否为顺子。同时,我们还需要知道0的个数,因为0可以当成任意数字。

def isStraight(nums):
    # 创建一个集合
    repeats = set()
    # 统计0的个数
    zero_count = 0
    # 计算最大值和最小值
    max_num = 0
    min_num = 14
    for num in nums:
        # 0可以当做任意数
        if num == 0:
            zero_count += 1
            continue
        # 更新最大值和最小值
        max_num = max(max_num, num)
        min_num = min(min_num, num)
        # 判断是否有重复数字
        if num in repeats:
            return False
        repeats.add(num)
    # 判断最大值和最小值差值是否小于等于4
    return max_num - min_num <= 4

3. 复杂度分析

我们可以看到,上述两种方法的时间复杂度都为O(N),其中N为数组的长度。在第一种方法中,排序数组的时间复杂度为O(NlogN),而第二种方法则是线性时间复杂度。

综上所述,我们可以使用排序数组或集合来判断随机抽取的扑克牌是否为顺子。其中,如果使用集合来判断,则不需要排序,并且时间复杂度更低。代码的实现过程中,需要注意重复数字的处理和0的个数的统计。