剑指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的运气如何。为了方便起见,你可以认为大小王是0。

解题思路

先从小到大排序
然后计算王牌的数量并剔除王牌
在剩下的数中考察相互之间的差,如果大于1,(说明不连续),就用王牌的总数减去差值
如果王牌没有超,那就是顺子

代码

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        //排序
        int length=numbers.size();
        if(length<5) return false;
        for(int i=0;i<5;i++){
            int min=i;
            for(int j=i;j<5;j++){
                if(numbers[j]<numbers[min]){
                    min=j;
                }
            }
            int temp=numbers[i];
            numbers[i]=numbers[min];
            numbers[min]=temp;
        }
        //从最小的开始遍历,计算王牌的数量,并查看后一个数是否是前一个数的连续,如果不是则用王牌抵消,王牌用完则返回false
        int base=0;
        //如果最大的数小于5,就意味着从JQK等的循环,要把所有小于5的加上13
        if(numbers[4]<5){
            base=13;
        }
        int zerocount=0;
        int next;
        int curr;
        //统计王牌数量
        for(int i=0;i<numbers.size();i++){
            if(numbers[i]==0){
                zerocount++;
                numbers.erase(numbers.begin()+i);
                i--;
            }
        }
        for(int i=0;i<numbers.size()-1;i++){
            //查看是否连续
            //当前数
            curr=numbers[i];
            if(curr<5){
                curr+=base;
            }
            //下一个数
            next=numbers[i+1];
            if(next<5){
                next+=base;
            }
            //连续
            if((next-curr)==1){
                continue;
            }else{
            //不连续
                int diff=next-curr-1;
                if(diff<0)return false;
                //用大小王代替
                if(zerocount>0){
                    zerocount-=diff;
                }else{
                    return false;
                }
            }
        }
        if(zerocount<0)return false;
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/neverever01/article/details/80868296