剑指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。

解题思路
题目看着复杂,分析一下其实很简单,就是随机给你一组牌,判断这组牌是否能组成顺子。主要分析一下几个要点:

  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()向前移动到目标位置。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。