题目
思路
大小王用0表示,其他为对应数字。
排序 + 计算两数的差值 + 与0的个数比较,确定是否为顺子。
代码
#include <iostream>
#include <algorithm>
#include <assert.h>
using namespace std;
bool IsSequence(int nArr[],int n)
{
assert(nArr && n > 0);
int nZeroCount = 0;
int nCur = 0;
int nDiff = 0;
//排序
sort(nArr,nArr + n);
for (int i = 0;i < n;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
//统计0的个数
while(nCur < n && nArr[nCur] == 0)
{
nZeroCount++;
nCur++;
}
//处理数据
while(nCur < n - 1)
{
nDiff = nArr[nCur + 1] - nArr[nCur] - 1;
if (nDiff == -1)//两数相等不可能为顺子,直接返回
{
return false;
}
if (nDiff > nZeroCount)
{
return false;
}
else
{
nZeroCount -= nDiff;
}
nCur++;
}
return true;
}
int main()
{
// int nLen = 5;
// int nArr[5] = {1,3,0,0,5};
int nLen = 5;
int nArr[5] = {10,13,0,0,8};
//int nLen = 5;
//int nArr[5] = {10,10,0,0,0};
// int nLen = 5;
// int nArr[5] = {5,4,2,3,1};
if (IsSequence(nArr,nLen))
{
cout<<"顺子!"<<endl;
}
else
{
cout<<"不是顺子!"<<endl;
}
system("pause");
return 1;
}