1. 个数不对,不是5个数的就不是顺子,第一排除
2. 有重牌(不包含0)的不是顺子,排除
3. 在牌数对且没有重牌的情况下,
无论有几个0,反正能凑成顺子的不过就是12345,23456,34567,45678,56789,678910,7891011,89101112,910111213这9中情况。遇到0不用管,反正是万能牌当几都可以,非0牌记下最大和最小,差值最多为4,超过4了,就算万能牌也弥补不了。
#include<stdbool.h>
bool IsContinuous(int* numbers, int numbersLen ) {
if(numbersLen != 5) //元素个数只能是5个,多了少了都不行
return false;
int d[14] = {0}; //新数组d[0]--d[13]存放牌面数字出现的次数,
int max = -1, min = 14, i = 0;
for(i = 0; i < numbersLen; i++){
d[numbers[i]]++; //对牌面数字出现次数计数
if(numbers[i] == 0) //牌面为0时,后面3个if不用管,不计数,不判断min和max
continue; //也就是转到i+1,注意min不可能变成0
if(d[numbers[i]] > 1) //从1到13若某个牌面数字出现不止一次
return false; //说明有重牌,不是顺子
if(numbers[i] < min) //常规更新min
min = numbers[i];
if(numbers[i] > max) //常规更新max
max = numbers[i];
}
if(max - min < 5) //正常顺子的最大值与最小值相差不超过4
return true;
return false;
}

京公网安备 11010502036488号