【剑指offer】面试题61 扑克牌顺子
作者:互联网
题目要求
一副扑克牌,里面有2个大王,2个小王,随机从中抽出了5张牌,看看能不能抽到顺子,
所谓顺子就是五个连续的数字,如1,2,3,4,5。为了方便测试其中大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。
现在,要求你使用这幅牌模拟上面的过程,如果随机抽出的牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
解题思路
根据题目的介绍,我们只需要做以下三件事就可以清楚的知道五张牌是不是顺子了:
(1)首先对数组中的元素排序
(2)统计数组中的大小王个数(即0的数量)
(3)统计排序之后,相邻元素之间的空缺总数
然后只要比较0的数量和空缺总数之间的关系即可,如果0的个数大于空缺总数那么可以组成顺子,反之不可以。
另外需要注意的是,有对子一定不能构成顺子!
主要代码c++
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=5)
return false;
sort(numbers.begin(), numbers.end());
int NumberofZero = 0; // 初始化都是0!!!
int NumberofGap = 0;
//统计0的个数
for(int i=0; i<numbers.size()&&numbers[i]==0;++i)
++NumberofZero;
//统计Gap的个数
int small = NumberofZero; //从第一个非0开始统计
int big = small + 1;
while(big<numbers.size())
{
// 如果遇到相邻两个数相等,即对子不是顺子
if(numbers[small]==numbers[big])
return false;
NumberofGap += numbers[big] - numbers[small] - 1; //Gap个数等于big,small之间的个数
small = big;
big++;
}
return (NumberofZero < NumberofGap) ? false:true;
}
};
标签:面试题,false,int,个数,61,numbers,空缺,顺子 来源: https://blog.csdn.net/qq_37466121/article/details/88423917