面试题44:扑克牌的顺子

来源:互联网 发布:装修监理必知 编辑:程序博客网 时间:2024/05/01 09:52

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。

思路:可以把5张牌看做一个数组,大小王设为0。然后对数组进行排序,看数组的数字是不是连续的,因为0可以看做任意数字,所以如果相邻两个数字之间有空缺可以用0补。
例如{0,1,3,4,5},1和3之间缺少一个2,刚好数组中有一个0,可以用0补2,就构成了顺子。

1.先对数组进行排序
2.计算出数组中0的个数
3.计算出数组相邻两个数之间空缺的个数,如果空缺总数小于或等于0的个数就是连续的,否则是不连续的。
4.如果数组中非0元素有重复的,则一定不是顺子。

#include <iostream>using namespace std;//自定义比较函数int compare(const void * arg1,const void * arg2){return *(int *)arg1-*(int *)arg2;}bool IsContinuous(int * number,int length){if(number==NULL||length<5)return false;//先对数组进行排序qsort(number,length,sizeof(int),compare);//计算0出现的个数int numberOfZero=0;for(int i=0;i<length;i++){if(number[i]==0){numberOfZero++;}}//计算数组中的间隔数目int numberOfGap=0;//因为数组是排序的,0的个数已计算好,所以从最后一个0的下一位开始计算int small= numberOfZero;//0的个数就是最后一个0的下一个元素的下标int big=small+1;while(big<length){//如果两个数相等,不是顺子if(number[small]==number[big]){return false;}//计算相邻两个数之间的间隔数,如5和3,5-3-1=1,5和3之间差了一个数numberOfGap=numberOfGap+(number[big]-number[small]-1);//向后遍历small=big;big++;}//如果间隔数大于0的个数,说明0不足够补空缺的数,返回false,否则返回truereturn (numberOfGap>numberOfZero)?false:true;}int main(){int arr[]={1,0,5,3,4};cout<<IsContinuous(arr,5)<<endl;return 0;}







0 0
原创粉丝点击