码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-01-28 23:51:05      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

题目:

  来源 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 判断扑克牌中的顺子

标签:

原文地址:http://www.cnblogs.com/wangzaizhen/p/5167517.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!