题目描述
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。
解题思路
题目看着复杂,分析一下其实很简单,就是随机给你一组牌,判断这组牌是否能组成顺子。主要分析一下几个要点:
- 抽出 牌的数量必须是5张;
- 不能有重复的牌出现;
- 除了大小王(也就是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;
}
};
注意:
- set容器的迭代器begin()、end()等返回的是iterator 类型的迭代器,而不是对应位置的元素值。
- end()迭代器指向的是最后一个元素的下一个位置,直接访问end()指向的元素是会越界的,如果想访问最后一个记录值,可以使用反向迭代器rbegin(),也可以使用STL中用于辅助操作迭代器的函数模板advance(it,n),将begin()向前移动到目标位置。
网友评论