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

来源:互联网 发布:昆汀电影配乐知乎 编辑:程序博客网 时间:2024/06/16 02:32
题目

  来源 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         else21             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 }

 

0 0
原创粉丝点击