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

题目

  来源 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!='')
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