标签:
题目:
来源 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