扑克牌顺子

本文介绍了如何判断一副包含大小王的扑克牌是否能组成顺子。大小王可视为任意数字,A视为1,J、Q、K分别视为11、12、13。通过计算非王牌的连续性和王牌的数量来确定是否为顺子。
摘要由CSDN通过智能技术生成

题目描述

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。

        好吧这个题只是看上去长,思路在于统计扑克牌次数,在根据最大牌和最小牌的距离和大小王数量加上1数量牌数比较来进行判断

, 如果大于则false,小于则ture。

    同时抽牌数大于13肯定不能为顺子,会有重复,也需处理小于13张牌时的重复不能为顺子的问题

     举个例子:

     2,3,5,7,8,10,0,0,0,0 牌数

     最小值为2,最大值为10 所以为顺子需要 10 - 2 + 1 = 9 张牌

     现在 有2-10的牌数为 6 王牌数为4  6 + 4 >= 9 所以可以为顺子

     2,3,5,7,8,10,0,0 牌数

     现在 有2-10的牌数为 6 王牌数为4  6 + 2 < 9 所以不能为顺子

实现如下:

        bool IsContinuous(vector<int> numbers) 
        {
            if (numbers.size() > 13)
                return false;

            vector<int> v;
            v.resize(14, 0);

            for (int i = 0; i < numbers.size(); i++)
            {
                ++v[numbers[i]];
            }

            bool first = true;
            int beign = 0;
            int end = 0;
            int count = 0;
            for (int i = 1; i < v.size(); i++)
            {
                if (v[i] > 1)
                {
                    return false;
                }
                if (first && v[i] == 1)
                {
                    beign = i;
                    end = i;
                    count++;
                    first = false;
                }
                else if (v[i] == 1)
                {
                    end = i;
                    count++;
                }
            }

            int len = end - beign + 1;
            if (count + v[0] >= len)
            {
                return true;
            }
            return false;
        }

test.cpp

    void start_test()
    {
        Solution s;

        vector<int> v;
        v.push_back(0);
        v.push_back(0);
        v.push_back(2);
        v.push_back(2);
        v.push_back(4);
      bool ret =   s.IsContinuous(v);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值