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这个癞子的情况下,是否是顺子!!!
千万不要理解成,随即抽取一组牌,为让我们求LL能抽到顺子的概率!
因此:我们可以对给定的牌进行从大到小的顺序进行排序!
排序完成之后遍历查找0元素的个数,以及累计非零元素之间的间隔数!
也即是看看癞子(0)的个数能不能抵掉这些间隔!
还有一种情况必须考虑!就是当有对子出现的时候,那么这个序列一定不可能是顺子!遇到这种情况,应当立即返回false!
思路清晰了,代码就简单啦!代码如下
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
int len = numbers.size();
if(len == 0) return false;
int numberofzero = 0;//0的个数;
int numberofgap = 0;//间隔的个数,单位为1;
sort(numbers.begin(),numbers.end()); //从小到大排序;
for(int i = 0;i<len-1;++i)
{
if(numbers[i] == 0)
{
numberofzero++;//找出中共有多少个0;
continue;
}
if(numbers[i] == numbers[i+1])
return false;
numberofgap += numbers[i+1]-numbers[i]-1; //找出总共有多少个间隔
}
if(numberofzero >= numberofgap)//比较0的个数和间隔的个数!
return true;
return false;
}
};