面试题44:扑克牌的顺子:从扑克牌中随机抽5张牌,判断是不是顺子,即5张牌是不是连续的,2~10为数字本身,A为1,J为11 Q为12,K为13而大小王可以看成任意的数字
思路:大小王用0表示,输入数组的范围为0~13 对输入的数组统计0的个数,然后进行排序设立两个游标smallIndex=numberOfZero,和bigIndex=smallIndex+1遍历数组统计相邻数的间隔,如果有对子则直接返回不是顺子,若遍历完间隔数小于等于0的个数则是顺子否则不是顺子
函数接口: boolIsContinuous(int *numbers,int length);
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
bool IsContinous(int *number,int length)
{
if(number==NULL||length<5)
{
return false;
}
int numberOfZero=0;
for(int i=0;i<length;i++)
{
if(number[i]==0)
{
numberOfZero++;
}
}
sort(number,number+length);
int numberOfGap=0;
int smallIndex=numberOfZero;
int bigIndex=smallIndex+1;
while(bigIndex<length)
{
if(number[bigIndex]==number[smallIndex])//有对子一定不是顺子
{
return false;
}
numberOfGap+=number[bigIndex]-number[smallIndex]-1;
smallIndex=bigIndex;
bigIndex++;
}
if(numberOfGap<=numberOfZero)
{
return true;
}
else
{
return false;
}
}
int main()
{
int test[]={2,3,6,7,0};
int length=sizeof(test)/sizeof(test[0]);
if(IsContinous(test,length))
{
cout<<"顺子"<<endl;
}
else
{
cout<<"不是顺子"<<endl;
}
return 0;
}