标签:
题目:
来源 http://www.cnblogs.com/python27/archive/2011/11/27/2264405.html
随机抽取扑克牌中的n张牌,判断是不是顺子,即这5张牌是不是连续的。其中A看成1,J看成11,Q看成12,K看成13,大小王可以看成任何需要的数字。
分析:
对于扑克牌来说,数字范围是很明确的,1到K外加大小王(设定为M)。假如这副牌是个顺子,也就是每张牌都不相同,那么利用一个大小为14的辅助数组counts[]就可以快速的实现排序,记录每张牌出现的次数,然后遍历输出次数为1的值即可。
判断这副牌是不是一个连续数列,需要判断相邻两个数字的差是否为1,大于1的话由M来填充(可以填充两个缺位)。
因为这样一副牌最多不过54张,算法时间复杂度O(1),空间复杂度O(1)
bool IsContinuousPoker(char* pokers,unsigned int n)
{
if (pokers==NULL||n==0)
throw std::exception("Invalid input.");
int *counts=new int[14]();
char *p=pokers;
unsigned int num=0;
while (*p!=‘\0‘)
{
if (*p==‘J‘)
num=11;
else if (*p==‘Q‘)
num=12;
else if (*p==‘K‘)
num=13;
else if(*p==‘M‘)
num=0;
else
num=*p-‘0‘;
counts[num]++;
if(num!=0&&counts[num]>1)
return false;
p++;
}
int pre=0;
for (int i=1;i<14;i++)
{
if (counts[i]==1)
{
int dif=i-pre-1;
if (pre!=0&&dif>0)
{
counts[0]-=dif;
if (counts[0]<0)
return false;
}
pre=i;
}
}
return true;
}
标签:
原文地址:http://www.cnblogs.com/wangzaizhen/p/5167517.html