剑指offer:扑克牌的顺子问题

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值