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; }