首页 > 试题广场 >

扑克牌顺子

[编程题]扑克牌顺子
  • 热度指数:479835 时间限制: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
#include <string.h>
#define MAX_NUM 14
#define FIVE   5
bool IsContinuous(int* numbers, int numbersLen ) 
{
    // write code here
    int buf[MAX_NUM];
    memset(buf, 0, sizeof(int)*MAX_NUM);
    int min_val = MAX_NUM;
    for(int i =0;i<numbersLen;i++)
    {
        buf[numbers[i]]++;
        if(numbers[i]!=0 &&numbers[i]<min_val)
            min_val = numbers[i];
    }
    int zero_sum = buf[0];
    int count = 0;
    for(int i =min_val;i<MAX_NUM && count<5;i++)
    {
        if(buf[i] == 0 && zero_sum <=0)
            return false;
        if(buf[i] == 0 && zero_sum >0)
            zero_sum--;
        count++;
    }
    count+=zero_sum;
    if(count == FIVE)
        return true;
     return false;
}
我这个时间空间应该都是O(n)把
发表于 2023-05-25 13:28:09 回复(0)
这SX题目,有问题
要求:空间复杂度 O(1),时间复杂度 O(nlogn)
怎么可能,害我思考了1个小时也没搞定
bool IsContinuous(int* numbers, int numbersLen ) {
    // write code here
    int min=13,max=1,wang=0;
    int list[14] ={0};
    for(int i=0; i<numbersLen; i++) {
        if(numbers[i] == 0){
            wang++;
        } else {
            if(list[numbers[i]]>0) return false;
            else list[numbers[i]]++;
            if(min>numbers[i]) {
                min=numbers[i];
            } else if(max<numbers[i]) {
                max=numbers[i];
            }
        }
    }
    if(wang==4) return true;    
    if(max-min>4) return false;
    else return true;
}
发表于 2022-11-11 17:34:39 回复(0)
/*排序*/
int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}
bool IsContinuous(int* numbers, int numbersLen ) {
    // write code here
    qsort(numbers,numbersLen,sizeof(int),cmpfunc);
    int max=0;
    int min=14;
    for(int i=0;i<numbersLen;i++)
    {
        if(numbers[i]!=0)//0跳过
        {
            if(numbers[i]>max)
            {
                max=numbers[i];
            }
            if(numbers[i]<min)
            {
                min=numbers[i];
            }
        }
        
    }
    for(int j=0;j<numbersLen;j++)
    {
        if(numbers[j]!=0)//0跳过
        {
            if(numbers[j]==numbers[j+1])
            {
                return false;
            }
        }
    }
    if(max-min<5)
        return true;
    return false;
}
发表于 2021-08-30 20:10:43 回复(0)