扑克牌是不是顺子
文章目录
//从扑克牌中抽出五张,判断是不是顺子,A用1表示;JQK用11,12,13表示;大小王看成任意数字
//首先排序数组,然后统计0的个数和数组中间隔数,如果0的个数>=间隔,返回true。
//还有需要注意,如果数组中有两个数字相同,那么不可能是顺子了。
#include <iostream>
#include<algorithm>
using namespace std;
int compare(const void *arg1,const void *arg2){
return *(int*)arg1-*(int*)arg2;
}
bool IsContinuous(int *data,int length){
if(data==NULL ||length<1)
return false;
qsort(data,length,sizeof(int),compare);//排序
int numberOfZero=0;//0的个数,间隔的数目
int numberOfGap=0;
//统计0的个数
for(int i=0;i<length;i++){
if(data[i]==0)
numberOfZero++;
}
//统计间隔数目
int small=numberOfZero;//必须从这个开始,因为0不能算在这个里面,代表的是任意
int big=small+1;
while(big<length){
//两个数相等,对子不可能是顺子
if(data[small]==data[big])
return false;
numberOfGap+=data[big]-data[small]-1;//比如 1 3 4 5
small=big;//两个指针,依次往后挪
big++;
}
return (numberOfGap<=numberOfZero)?true:false;
}
int main()
{
int data[]={2,4,5,6,0};
cout<<IsContinuous(data,5);
return 0;
}