题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看作任意数字。
思路:首先把数组排序,其次统计数组中0的个数;最后统计排序之后的数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。
代码1:使用sort全排序,对数组进行排序,然后统计0的个数,计算相邻数字之间的总空缺数,并比较0的个数和总空缺数。报错:只通过了一部分的测试用例,以[0,3,2,6,4]为例,应该输出true,而我的代码输出为false。出错原因:如果有一个元素为0的话,下一个不应该跟0求差值,所以两个判断语句之间的关系应该是if-else。
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size() == 0) return false
sort(numbers.begin(),numbers.end());
int count = 0;
int zeroCount = 0;
if(numbers[0] == 0)
zeroCount++;
for(int i=1;i<numbers.size();i++){
if(numbers[i] == 0)
zeroCount++;
if(numbers[i] == numbers[i-1])
return false;
else
count += numbers[i] - numbers[i-1] - 1;
}
if(count <= zeroCount)
return true;
else
return false;
}
};
改进后的代码:
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size() == 0) return false;
sort(numbers.begin(),numbers.end());
int count = 0;
int zeroCount = 0;
//统计数组中0的个数
//for(int i=0;i<numbers.size() && numbers[i] == 0;i++){
//zeroCount++;
//}
for(int i=0;i<numbers.size();i++){
if(numbers[i] == 0)
zeroCount++;
else{
if(i+1<5){
if(numbers[i] == numbers[i+1])
return false;
else
count += numbers[i+1] - numbers[i] -1;
}
}
}
if(count <= zeroCount)
return true;
else
return false;
}
};