题目描述
从扑克牌中随机抽5张牌,判断是不是一个顺子;即这5张牌是不是连续的。2~10是数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字,为了方便,将大小王定义为数字0。
思路
先将数组进行排序,然后统计0的个数;对于后续的非零递增序列,统计不连续的空缺值(如1和4,空缺为4 -1-1=2),如果0的个数小于等于差值总和,则满足顺子;否则不满足。
代码
class Solution {
public:
// 如果空缺总数小于等于0的个数,则数组连续
bool IsContinuous( vector<int> numbers ) {
if (numbers.size() != 5)
return false;
int len = numbers.size();
bool isCont = true;
sort(numbers.begin(),numbers.end());
int index = 0;
while(numbers[index]==0) ++index; // 统计0的个数
// 从第2个非零项开始
for (int i = index+1; i < len; ++i) {
// 如果有非零重复项则不可能连续
if (numbers[i] == numbers[i-1])
return false;
// 连续项
if (numbers[i]- numbers[i-1] ==1){
continue;
}
// 不连续但是有0可替代
if (index>0 && numbers[i] - numbers[i-1] <= index+1)
--index;
else if (numbers[i] - numbers[i-1] > index +1)
return false;
}
return isCont;
}
};