美文网首页数据结构&算法&人工智能
剑指offer编程题—扑克牌顺子

剑指offer编程题—扑克牌顺子

作者: 零岁的我 | 来源:发表于2020-05-12 15:36 被阅读0次

    题目描述
    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. 抽出 牌的数量必须是5张;
    2. 不能有重复的牌出现;
    3. 除了大小王(也就是0)之外,其他牌的最大值与最小值得差值应该小于5;

    因为不能有重复牌,因此这里可以使用set容器填充数据,0不进容器,如果最后0的数量加上set容量小于5,则代表有重复元素出现。
    因为set内元素是有序递增的,所以牌的最大差值就是set内最后一个元素与第一个元素的差。

    class Solution {
    public:
        bool IsContinuous( vector<int> numbers ) {
            if(numbers.size() != 5) return false;
            set<int> st;
            int num0=0;
            for(int i=0;i<numbers.size();++i){
                if(numbers[i]==0) ++num0;
                else{
                    st.insert(numbers[i]);
                }
            }
            if(num0+st.size() != 5) return false;
            if(*(st.rbegin())-*(st.begin())<5) return true;
            return false;
        }
    };
    

    注意:

    1. set容器的迭代器begin()、end()等返回的是iterator 类型的迭代器,而不是对应位置的元素值。
    2. end()迭代器指向的是最后一个元素的下一个位置,直接访问end()指向的元素是会越界的,如果想访问最后一个记录值,可以使用反向迭代器rbegin(),也可以使用STL中用于辅助操作迭代器的函数模板advance(it,n),将begin()向前移动到目标位置。

    相关文章

      网友评论

        本文标题:剑指offer编程题—扑克牌顺子

        本文链接:https://www.haomeiwen.com/subject/igvbnhtx.html