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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题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)

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;
}

  

以上是关于算法题7 判断扑克牌中的顺子的主要内容,如果未能解决你的问题,请参考以下文章

【动漫算法】扑克牌的顺子

算法剑指 Offer 61. 扑克牌中的顺子 重刷

扑克牌中的顺子

算法系列——扑克牌中的顺子(剑指offer)

#yyds干货盘点#剑指 Offer 61. 扑克牌中的顺子

算法:扑克牌的顺子