力扣剑指offer之扑克牌中的顺子

本文介绍了一种算法,用于判断从多副扑克牌中抽取的5张牌是否构成顺子。通过排序和检查相邻元素之间的关系,文章详细解释了如何处理大小王作为任意数字的情况,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指 Offer 61. 扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True

思路分析:本题在力扣上的标签是一道简单题,但是你可能刚看到题目会感觉很复杂,其实就是一组0到13的数,问你这组数是不是连续的,其中0可以看作任意数。

来判断是不是有序?那肯定先排个序再说。排完序后,那就开始看相邻元素了,有下面这四种情况。
1、如果相邻元素正好差一,那就往后遍历。
2、如果相邻元素相差大于1,那就需要拿0来补。
3、如果相邻元素就是0,那就直接跳过。
4、如果相邻元素相等,那么直接返回false,不可能成顺子。

所以我们在代码实现过程中,就围绕这几个判断进行。关于如何确定当相邻元素差不为1时,如何判断补全问题,这里提供两种思路:
一、那我们就看相邻元素中间隔了几个,和目前剩余的0数量进行比较,如果不够使,就直接返回false,如果够使,就进入下一层循环,记得更新0数量。
二、我们统计相邻元素差不为1的元素之间需要补上多少元素,在统计0元素数量,然后比较总数,如果0元素数量大于需要补上的元素数量,那就说明够使,返回true。否则false;

public boolean isStraight(int[] nums) {

        Arrays.sort(nums);

        int count = 0;
        boolean flag = true;
        int se = 0;
        for(int i = 0; i < nums.length - 1; i++){
            if(nums[i] == 0){
                count += 1;
            }else{
                if(nums[i] == nums[i+1]){
                    return false;
                }
                if(nums[i]+1 != nums[i+1]){
                    se += nums[i+1] - nums[i] - 1;
                }
            }
            
        }

        return count >= se;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值