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

分析:我们假定大小王为0,首先将数组排序,再统计数组中的0的个数,最后统计排序之后的数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的,否则就不是。另外,当数组中非零数字重复出现,说明牌中有对子,则这个数组不可能是顺子。实现如下:

bool IsContinuous(int* numbers,int length)
{
    if(numbers==NULL||length<1)
        return false;
        
    qsort(numbers,length,sizeof(int),compare);
    
    int numberOfZero=0;
    int numberOfGap=0;
    
    for(int i=0;i<length&&numbers[i]==0;i++)
        numberOfZero++;
    
    int small=numberOfGap;
    int big=small+1;
    while(big<length)
    {
        if(numbers[small]==numbers[big])
            return false;
        
        numberOfGap+=numbers[big]-numbers[small]-1;
        small=big;
        ++big;
    }
    return (numberOfGap>numberOfZero)?false:true;
}

int compare(const void *arg1,const void *arg2)
{
    retrun *(int*)arg1=*(int*)arg2;
}