学习了一段时间《剑指offer》现在做了一些笔试,现在陆续把笔记上传到博客,方便自己及他人上网查看。
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的,2-10为数字本身,A为1,J=11,Q=12,K=13;而大小王可以看成任意数字。
思路:大小王是特殊的数字,把它设置为0.接下来分为三个步骤
1、首先把数组排序;
2、并统计数组中0的个数;
3、统计排序之后的数组中相邻数字之间的空格总数。
如果空缺的总数小于或者等于0的个数,则连续,反之不连续;
注意:如果数组中有非0数字重复出现,则该数组不是连续的。
代码如下:
int compare(const void *arg1, const void *arg2)
{
return *(int*)arg1 - *(int*)arg2;
}
bool IsContinuous(int* number, int length)
{
if (number == NULL || length < 1)
return false;
qsort(number, length, sizeof(int), compare);
int numberZero = 0;
int numberGap = 0;
for (int i = 0; i < length; ++i)//统计0的个数
{
if (number[i] == 0)
numberZero++;
}
int small = numberZero;
int big = small + 1;
while (big < length)
{
if (number[small] == number[big])
return false;
numberGap += number[big] - number[small] - 1;
small = big;
big++;
}
return (numberGap>numberZero) ? false : true;
}