剑指offer第二版(Python3)--面试题61 :扑克牌中的顺子

第2章 面试需要的基础知识

第3章 高质量的代码

第4章 解决面试题的思路

第5章 优化时间和空间效率

  面试题39 : 数组中出现次数超过一半的数字
  面试题40 : 最小的k个数
  面试题42 : 连续子数组的最大和
  面试题43 : 从1到n整数中1出现的次数
  面试题45 : 把数组排成最小的数
  面试题49 : 丑数
  面试题50 : 第一个只出现一次的字符
  面试题51 : 数组中的逆序对
  面试题52 : 两个链表的第一个公共结点
  面试题53 : 在排序数组中查找数字
  面试题55 : 二叉树的深度、平衡二叉树
  面试题56 : 数组中数字出现的次数
  面试题57 : 和为s的连续正数序列、和为s的数字
  面试题58 : 翻转字符串、左旋转字符串
  面试题61 : 扑克牌中的顺子

第6章 面试中的各项能力

第7章 两个面试案例


题目描述
牛客网
  从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10位数字本身,A为1,J为11,Q为12, K为13,你可以认为大小王就是数字0,大小王可以抵任意数字。

解题思路
解法一:

  1. 首先排序数组;
  2. 统计数组中0的个数;
  3. 统计排序后数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么数组就是连续的,反之不连续。

实战

class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if not numbers:
            return False
        numbers.sort()
        zeros = 0
        pre = None
        for num in numbers:
            if num == 0:
                zeros += 1
            if not pre:
                pre = num
            elif num == pre:
                return False
            else:
                diff = num - pre - 1
                zeros -= diff
                pre = num
            if zeros < 0:
                return False
        return True

解法二:
  统计数组中最大值和最小值,0的个数和非0数字的个数。如果最大值和最小值之间的空位可以被0和剩余非0数字填满,则数组是连续的,否则不连续。

实战

class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if not numbers:
            return False
        zeros, maxi, mini = 0, -1, 14
        counts = 0
        exist = set()
        for num in numbers:
            if num == 0:
                zeros += 1
                continue
            if num in exist:
                return False
            if num > maxi:
                maxi = num
            if num < mini:
                mini = num
            counts += 1
            exist.add(num)
        return maxi - mini + 1 - counts <= zeros
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值