题目描述
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。
#include<cstdlib>
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
int len = numbers.size();
if(len == 0) return false;
qsort(&numbers[0], len, sizeof(int), compare);
int numOfZero = 0;
int blank = 0;
int i = 0;
while(i < len)
{
if(numbers[i] == 0)
{
numOfZero++;
i++;
}
else
break;
}
// 全为0,返回true
if(i >= len)
return true;
// 有非0数字,统计间隙数,并与零的个数相比较
else
{
// 判断是否到达最后一位
while(i + 1 < len)
{
int curBlank = numbers[i + 1] - numbers[i] - 1;
// 有相同的两张扑克,不能成顺子,立马返回false
if(curBlank == -1)
return false;
else
blank += curBlank;
i++;
}
if(blank <= numOfZero)
return true;
else
return false;
}
}
static int compare(const void* arg1, const void* arg2)
{
return *(int*)arg1 - *(int*)arg2;
}
};
调错总结:
(1)qsort函数在头文件<cstdlib>下,第一个参数为指针,指向待排序的第一个元素。
(2)比较函数compare需定义为静态static,因为排序函数qsort会调用到它,qsort这类函数与具体实例无关。