剑指offer系列——45.扑克牌顺子
Q: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。
T:
1.满足两个条件:除0以外没有数字重复;除0外最大值和最小值之间误差小于5
bool IsContinuous(vector<int> numbers) {
if (numbers.empty() || numbers.size() != 5)
return false;
int maxnum = *max_element(numbers.begin(), numbers.end());
int minnum = *min_element(numbers.begin(), numbers.end());
if (maxnum > 14 || minnum < 0)
return false;
int hash[15] = {0};
for (int i = 0; i < numbers.size(); i++)
hash[numbers[i]]++;
if (hash[0] == 5)
return false;
vector<int> temp;
for (int i = 1; i < 15; i++) {
if (hash[i] > 1)
return false;
else if (hash[i] == 1)
temp.push_back(i);
}
minnum = *min_element(temp.begin(), temp.end());
return maxnum - minnum < 5;
}
P.S.初始化hash全为0,否则会自动往里随机填值。初始化数组为0的方法为 array = {0} 或 memset(array, 0, ARRAY_SIZE_MAX);
这里介绍一下两个函数:
max_element:include from algorithm,返回值为最大值的位置,通过*max_element(vector)来获取最大值;
min_element:include from algorithm,返回值为最小值的位置,通过*min_element(vector)来获取最小值;