算法题7 判断扑克牌中的顺子

本文介绍了一种高效算法用于判断扑克牌组成的序列是否为连续顺子,通过使用辅助数组快速记录每张牌出现的次数,并遍历判断是否满足连续条件。此算法适用于任意数量的扑克牌,且时间、空间复杂度均为常数级别。

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

题目

  来源 http://www.cnblogs.com/python27/archive/2011/11/27/2264405.html

  随机抽取扑克牌中的n张牌,判断是不是顺子,即这5张牌是不是连续的。其中A看成1J看成11Q看成12K看成13,大小王可以看成任何需要的数字。

分析

  对于扑克牌来说,数字范围是很明确的,1到K外加大小王(设定为M)。假如这副牌是个顺子,也就是每张牌都不相同,那么利用一个大小为14的辅助数组counts[]就可以快速的实现排序,记录每张牌出现的次数,然后遍历输出次数为1的值即可。

判断这副牌是不是一个连续数列,需要判断相邻两个数字的差是否为1,大于1的话由M来填充(可以填充两个缺位)。

因为这样一副牌最多不过54张,算法时间复杂度O(1),空间复杂度O(1)

代码

 1 bool IsContinuousPoker(char* pokers,unsigned int n)
 2 {
 3     if (pokers==NULL||n==0)
 4         throw std::exception("Invalid input.");
 5 
 6     int *counts=new int[14]();
 7 
 8     char *p=pokers;
 9     unsigned int num=0;
10     while (*p!='\0')
11     {
12         if (*p=='J')
13             num=11;
14         else if (*p=='Q')
15             num=12;
16         else if (*p=='K')
17             num=13;
18         else if(*p=='M')
19              num=0;
20         else
21             num=*p-'0';
22 
23         counts[num]++;
24         if(num!=0&&counts[num]>1)
25             return false;
26 
27         p++;
28     }
29 
30     int pre=0;
31     for (int i=1;i<14;i++)
32     {
33         if (counts[i]==1)
34         {
35             int dif=i-pre-1;
36             if (pre!=0&&dif>0)
37             {
38                 counts[0]-=dif;
39                 if (counts[0]<0)
40                     return false;                
41             }
42             pre=i;
43         }
44     }
45     return true;
46 }

 

转载于:https://www.cnblogs.com/wangzaizhen/p/5167517.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值