61 扑克牌中的顺子
题目
抽取5张牌,判断是不是一个顺子。2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可堪称任意数字。
C++ 题解
把5张牌看成一个数组,就看排序后的数组是不是连续的,大小王看成特殊的数字,例如定义为0,与其他数字区分开,0的作用就是补充其他数字间不连续的空缺。
步骤:
- 将数组排序;
- 统计0的个数;
- 统计排序后的数组中相邻数字之间的空缺总数,如果空缺总数大于0的个数,那么该数组不连续,如果空缺总数小于或等于0的个数,那么该数组连续。
注意:
如果非0数组重复出现,那么该数组也不是连续的,即扑克牌中出现了对子,不可能是顺子。
bool IsContinuous(vector<int> numbers) {
if (numbers.size() != 5)
return false;
// 排序
sort(numbers.begin(), numbers.end());
int numOfZero = 0;
//统计0的个数
for (int i = 0; i != 5; i++) {
if (!numbers[i])
numOfZero++;
}
int beg = numOfZero+1;
int numOfGap = 0;
while (beg < 5) {
//如果出现了对子,那么肯定不可能是顺子
if (numbers[beg - 1] == numbers[beg])
return false;
// 注意 -1
numOfGap += numbers[beg] - numbers[beg - 1] -1;
beg++;
}
return (numOfZero >= numOfGap) ? true : false;
}
python 题解
# -*- coding:utf-8 -*-
class Solution:
def IsContinuous(self, numbers):
# write code here
if not numbers:
return False
numbers.sort()
zeros = numbers.count(0)
for i,value in enumerate(numbers[:-1]):
if value != 0:
if value==numbers[i+1]:
return False
zeros=zeros - (numbers[i+1]-value-1)
if zeros <0 :
return False
return True

浙公网安备 33010602011771号