题目描述 [扑克牌顺子]
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
解题思路一
- 排序
- 计算0的个数
- 计算相邻数字距离,保证数字不重复(0除外)
- 比较距离是否小于0的个数
代码
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=5) return false;
sort(numbers.begin(), numbers.end());
int num_zero=0;
int i=0;
while(numbers[i]==0){
num_zero++;
i++;
}
if(num_zero==4) return true;
while(i<4){
if(numbers[i+1]-numbers[i]==1) i++;
else{
if(numbers[i+1]==numbers[i]) return false;
if(num_zero>0 && numbers[i+1]-numbers[i]-1<=num_zero){
num_zero = num_zero - numbers[i+1] + numbers[i] + 1;
i++;
}
else return false;
}
}
return true;
}
};
解题思路二
如果5个数(含0)是连续的,那么最大值和最小值的差值必然小于等于4。当然我们还要排除0外其他数字重复出现的情况。
所以算法可以如下进行:
- 保证除0外其他数字不重复出现
- 计算MAX-MIN的值是否小于4;
代码
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.empty()) return false;
int max = 0;
int min = 14;
int temp = 15;//记录上一个值,与下一个进行比对
for(int i = 0;i<numbers.size()-1;i++)
{
if(temp==numbers[i]) return false;//重复
if(numbers[i]==0)//是癞子的,则结束本次循环
{
continue;
}
if(numbers[i]>max) max = numbers[i];//记录最大值
if(numbers[i]<min) min = numbers[i];//记录最小值
temp = numbers[i];
if(max-min>=5) return false;//如果过程中出现max-min>=5说明不可能组成顺子
}
return true;
}
};