首页 > 试题广场 >

扑克牌顺子

[编程题]扑克牌顺子
  • 热度指数:488841 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]

要求:空间复杂度 ,时间复杂度 ,本题也有时间复杂度 的解法

输入描述:
输入五张扑克牌的值


输出描述:
五张扑克牌能否组成顺子。
示例1

输入

[6,0,2,0,4]

输出

true

说明

中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true 
示例2

输入

[0,3,2,6,4]

输出

true
示例3

输入

[1,0,0,1,0]

输出

false
示例4

输入

[13,12,11,0,1]

输出

false
# 排序,找出剩余数是否相同,最大值减去最小值<=4就能组成顺子
numbers.sort()
list1 = [x for x in numbers if x > 0]
if list1[-1]-list1[0]<=4 and len(list1)==len(set(list1)):
    return True
return False
发表于 2023-08-17 17:05:23 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        if numbers.count(0) >= 4:
            return True
        if max([numbers.count(x) for x in numbers if x != 0]) > 1:
            return False
        x = min([x for x in numbers if x != 0])
        y = max([x for x in numbers if x != 0])
        res = []
        for i in range(x, y+1):
            if i not in numbers:
                res.append(i)
        return len(res) == numbers.count(0) if res else True

发表于 2022-06-20 22:40:13 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param numbers int整型一维数组 
# @return bool布尔型
#
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        numbers.sort()
        
        num0 = numbers.count(0)
        
        if num0 == 4:
            return True
        
        for i in range(num0,len(numbers)-1):
            if numbers[i] == numbers[i+1]:
                return False
            
        numother = 5 - num0
        if numbers[-1] - numbers[num0] + 1 - numother <= num0 and numbers[-1] - numbers[num0]:
            return True
        else:
            return False
        

发表于 2022-05-31 11:48:48 回复(0)
class Solution:
    # 哈希表
    # 时间复杂度:O(n)  空间复杂度:O(n)
    def IsContinuous(self , numbers: List[int]) -> bool:
        mp = {}
        max_ = -2022
        min_ = 2022
        for num in numbers:
            if num > 0:
                if num in mp:
                    return False  # 顺子不能重复
                else:
                    mp[num] = 1
                    if num > max_:
                        max_ = num  
                    if num < min_:
                        min_ = num  
        if max_ - min_ > 4:  # 最大牌与最小牌差值不能超过4
            return False
        else:
            return True

class Solution:
    # 排序法
    # 时间复杂度:O(nlogn)  空间复杂度:O(1)
    def IsContinuous(self , numbers: List[int]) -> bool:
        numbers.sort()
        zero = 0
        gap = 0
        for i in range(len(numbers) -1):
            if numbers[i] == 0:
                zero += 1
            else:
                if numbers[i + 1] == numbers[i]:
                    return False
                else:
                    gap += numbers[i + 1] - numbers[i] - 1
        if gap > zero:
            return False
        else:
            return True
发表于 2022-05-10 16:03:26 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        numbers.sort()
        zeros = 0
        l = []
        prev = -1
        for n in numbers:
            # 遇到大小王,放入任意牌
            if n == 0:                
                zeros += 1
            # 检查有无重复的数字
            else:
                # 初次加入数字
                if prev == -1:
                    l.append(n)
                    prev = n
                else:
                    # 有重复值
                    if prev == n:
                        return False
                    # 没有重复值,且连续
                    elif n - prev == 1:
                        l.append(n)
                        prev = n
                    # 没有重复值,且不连续
                    else:
                        gap = n - prev - 1
                        zeros -= gap
                        prev = n
                        if zeros < 0:
                            return False
        return True

发表于 2022-04-24 14:45:27 回复(0)
先找出最大值,然后-1 看是否在list中,不满足就看0的情况
            
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        max_number = max(numbers)
        for i in range(4):
            if max_number-1 in numbers and max_number-1 != 0:
                max_number = max_number-1
            else:
                if 0 in numbers:
                    numbers.remove(0)
                    max_number = max_number-1
                else:
                    return False
        return True
            

发表于 2022-02-28 16:17:19 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        sortedNumbers=sorted(numbers)
        if 0 in numbers:
            zeroCount=sortedNumbers.count(0)
            if zeroCount==4:
                return True
            for i in range(len(numbers)-zeroCount-1):
                if sortedNumbers[i+zeroCount]==sortedNumbers[i+zeroCount+1]:
                    return False
                else:
                    continue
            if int(sortedNumbers[-1])-int(sortedNumbers[zeroCount])<=4:
                return True
            else:
                return False
        else:
            for i in range(len(numbers)-1):
                if sortedNumbers[i]==sortedNumbers[i+1]:
                    return False
                else:
                    continue
            if int(sortedNumbers[-1])-int(sortedNumbers[0])<=4:
                return True
            else:
                return False
嘿嘿 过了
发表于 2022-01-11 17:05:33 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        numbers.sort()
        count = 0#是相邻数的差值,记录需要几个0
        zero_count = 0 #是0的个数
        for i in range(len(numbers)):
            if numbers[i] == 0:
                zero_count+=1
            else:
                if i+1 <= len(numbers)-1 and numbers[i] == numbers[i+1]:
                    return False
                if i+1 <= len(numbers)-1 and (numbers[i+1] - numbers[i])!=1:
                    count+=(numbers[i+1] - numbers[i])-1
        if zero_count >=4:
            return True
        if count == 0:
            return True
        if count == zero_count:
            return True
        else:
            return False

发表于 2022-01-09 14:51:58 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        while 0 in numbers:
            numbers.remove(0)
        if len(set(numbers))!=len(numbers):
            return False
        else:
            if max(numbers)-min(numbers)<=4:
                return True
            else:
                return False

发表于 2022-01-06 05:36:43 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        # write code here
        c, m = 0, list()
        for i in numbers:
            if i == 0:
                c += 1
            else:
                if i in m:
                    return False
                m.append(i)
        else:
            if max(m) - min(m) < 5:
                return True
        return False
发表于 2021-12-19 12:23:14 回复(0)
没问题吧,前面12个都过了,[1,3,0,5,0]卡着了,答案是true,我输出的是false
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
        numbers.sort()
        a = [] #0
        b = [] #其他数
        if numbers[0] == numbers[1] or numbers[1] == numbers[2] or numbers[2] == numbers[3] or numbers[3] == numbers[4]:
            return False
        for i in range(len(numbers)):
            if numbers[i] == 0:
                a.append(numbers[i])
            else:
                b.append(numbers[i])
        if not a:
            if b[4] - b[0] == 4:
                return True
            else:
                return False
        else:
            if b[len(b)-1] - b[0] <= 4:
                return True
            else:
                return False
发表于 2021-12-09 20:46:00 回复(0)
class Solution:
    def IsContinuous(self , numbers: List[int]) -> bool:
            numbers.sort()
            num = numbers.count(0)
            if num == 4:
                return True
            temp = num
            for i in range(num, len(numbers)-1):
                if numbers[i] == numbers[i+1]:
                    return False
                if numbers[i] != numbers[i+1] - 1:
                    temp -= numbers[i+1] - numbers[i] - 1
                    if temp < 0 :
                        return False
            return True
发表于 2021-12-05 15:45:51 回复(0)
不不不,我最菜
# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        if 0 not in numbers:
            b = sorted(numbers)
            k = 0
            for i in range(len(numbers)-1):
                if b[i+1]-b[i] != 1:
                    k += 1
                    return False
            if k == 0:
                return True
        else:
            b = sorted(numbers)
            k = 0
            c = b.count(0)
            for x in range(c):
                b.remove(0)
            for i in range(len(b)-1):
                if b[i+1]-b[i] != 1:
                    k += b[i+1]-b[i]-1
            if k > c:
                return False
            for each in b:
                if b.count(each) > 1:
                    return False
                else:
                    return True

发表于 2021-09-18 20:44:12 回复(0)
# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        numbers.sort()
        zero = numbers.count(0)
        save = numbers[zero:]
        t = 0
        for i in range(0,len(save)-1):
            if(save[i] == save[i+1]):
                return False
            else:
                t = t + save[i+1] - save[i]-1
        if(t <= zero):
            return True
        else:
            return False

发表于 2021-09-03 22:35:30 回复(0)
class Solution:
    def IsContinuous(self, numbers):
        if 0 not in numbers:
            numbers.sort()
            b=[]
            for i in range(numbers[0],numbers[-1]+1):
                b.append(i)
            if len(b)==len(numbers):
                return True
            else:
                return False
        elif 0 in numbers:
            if numbers.count(0)==4:
                return True
            elif numbers.count(0)==3:
                numbers.sort()
                if numbers[-1]-numbers[-2]<=4 and numbers[-1]!=numbers[-2]:
                    return True
                else:
                    return False
            elif numbers.count(0)==2:
                    numbers.sort()
                    if numbers[-1]-numbers[-3]<=4 and numbers[-1]!=numbers[-2]!=numbers[-3]:
                        return True
                    else:
                        return False
            elif numbers.count(0)==1:
                    numbers.sort()
                    if numbers[-1]-numbers[-4]<=4 and numbers[-1]!=numbers[-2]!=numbers[-3]!=numbers[-4]:
                        return True
                    else:
                        return False#
发表于 2021-09-01 20:16:15 回复(0)
# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        max_value = -1
        min_value = 14
#         zerosnum = 0
        numbers_delete_zeros = []
        for i in numbers:
            if i:
#                 zerosnum += 1
#             else:
                if i > max_value:
                    max_value = i
                if i < min_value:
                    min_value = i
                frequence = numbers.count(i)
                if frequence > 1:
                    return False
        if max_value - min_value <= 4:
            return True
        else:
            return False
        
        # write code here
发表于 2021-08-17 12:34:12 回复(0)
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        Set=set()
        Min=14
        Max=0
        for num in numbers:
            if num>0:
                if num in Set:
                    return False
                Set.add(num)
                Min=min(Min,num)
                Max=max(Max,num)
        return Max-Min<5

发表于 2021-08-05 15:26:14 回复(0)
class Solution:
    def IsContinuous(self, numbers):
        count = 0 #记录0的个数
        length = len(numbers) #数组长度
        if length != 5:return False #如果数组长度大于5 返回F
        for num in numbers: #遍历
            if num == 0:
                count += 1 #计数0
            else:
                if numbers.count(num) > 1: return False #判断非0数在数组中出现的次数,超过1,返回F
        if count != 0:
            for i in range(count):
                numbers.remove(0) #移除数组中的0
        if max(numbers) - min(numbers) <= 4:return True #判断最大值与最小值之间的差值是否小于5
        

发表于 2021-08-05 12:29:01 回复(0)

问题信息

难度:
22条回答 132099浏览

热门推荐

通过挑战的用户

查看代码
扑克牌顺子