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
posted @ 2019-03-17 20:32  youngliu91  阅读(142)  评论(0)    收藏  举报