题目描述
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);
}