题目描述:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字(用0表示)。
解题思路:
- 第一步:将抽取的5张牌放在5个数字组成的数组,然后将其排序。
- 第二步:判断这5个数字是不是连续的,可以用0去补满数组中的空缺。
- 统计数组中0的个数;统计排序之后的数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么就是连续的,反之不连续。
- 如果非0数字重复出现,则该数组不是连续的。即有对子肯定不是顺子。
测试用例:
int main(){
//扑克牌数组
int proker[5] = {1, 0, 4, 5, 0};
//判断是否为顺子
if(IsContinuous(proker, 5))
std::cout << "Is Continuous\n";
else
std::cout << "Isn't Continuous\n";
return 0;
}
函数实现:
int compare(const void* arg1, const void* arg2){
return *(int*)arg1 - *(int*)arg2;
}
//函数实现
bool IsContinuous(int *proker, int length){
if(proker == NULL || length <= 0)
return false;
//对数组排序
qsort(proker, length, sizeof(int), compare);
//0的个数
int numberOfZero = 0;
//缺口个数
int numberOfGap = 0;
//统计0的个数
for(int i = 0; i < length && proker[i] == 0; ++i)
++numberOfZero;
//统计数组中的间隔数目
int small = numberOfZero;
int big = small + 1;
while(big < length){
//如果两个数字相等,有对子则不可能是顺子
if(proker[small] == proker[big])
return false;
numberOfGap += proker[big] - proker[small] - 1;
small = big;
++big;
}
return (numberOfGap > numberOfZero) ? false : true;
}