题目
【LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王。他随机从中抽出了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张牌抽象成5个数字,相当于检查这5个数字能否排成连续的顺子。且 0 可以看成任何数字。所以需要做三件事情:
- 首先将数组排好序
- 再统计数组中 0 的个数
- 最后统计排序之后的数组中相邻数字之间空缺的数字,如果空缺的总数小于或者等于 0 ,则数组连续,否则数组不连续。
- 由于从 0 ~ 13之间的每个数字可能会出现4次,如果数组中有除0之外的其他数字重复出现,则该数组就不可能是顺子。
- 由于该数组只有5个数字,当使用 sort 函数进行排序和其他的方法进行排序差别不大通常认为不同级别的时间复杂度只有当n足够大的时候才有意义。
2、代码
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
int len=numbers.size();
if(len!=5)
return false;
// 对容器中的5个数字进行排序
sort(numbers.begin(),numbers.end());
// 统计数组中0元素的个数
int left=0;
while(numbers[left]==0)
{
left++;
}
//遍历容器中的五个元素,并进行判断
for(int i=left+1;i<len;++i)
{
//如果有重复的非0数字,则不能构成顺子
if(numbers[i]==numbers[i-1])
return false;
else
{
//看0能否填补两个元素之间的值
left-=(numbers[i]-numbers[i-1]-1);
}
}
if(left>=0)
return true;
else
return false;
}
};