扑克牌顺子

雨燕双飞 提交于 2019-11-28 22:57:30

题目描述

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!