主要思路:
把大小王视为0,先排序,排完之后,统计其中0的个数,和排序后每两个数之间间隔的和,比较和与0的个数,如果相等则认为是连续的(大小王可视为任何一张牌),所以间隔减去大小王的数就等于,无法连续的间隔数
以下代码在vs2015中调试运行无误
#include "stdafx.h"
#include<iostream>
using namespace std;
int compare(const void *arg1, const void *arg2)
{
return (*((int*)arg1) - *((int *)arg2));
}
bool IsContinuous(int *input,int length)
{
if (NULL == input || length < 1)
return false;
qsort(input, length, sizeof(int), compare);
int numberOfZero = 0;
int numberOfGap = 0;
//统计数组中0的个数
for (int i = 0; i < length && (0 == input[i]); ++i)
{
++numberOfZero;
}
//统计数组中间隔的个数
int small = numberOfZero;
int big = small + 1;
while (big < length)
{
//两个数相等,有对子,不可能是顺子
if (input[small] == input[big])
{
return false;
}
numberOfGap += input[big] - input[small] - 1;
small = big;
++big;
}
return (numberOfZero < numberOfGap) ? false : true;
}
int main()
{
const int inputNum = 5;
int * input = new int[inputNum];
for (int i = 0; i < inputNum; i++)
{
cin >> input[i];
}
if (IsContinuous(input, inputNum))
{
printf("the input is continuous!\n");
}
else
{
printf("the input is not continuous!\n");
}
delete[] input;
input = NULL;
while (1);
return 0;
}