[LeetCode]剑指 Offer 61. 扑克牌中的顺子

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 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

题解一:

	/**
     * 剑指 Offer 61. 扑克牌中的顺子
     */
    public boolean isStraight(int[] nums) 
        /*
         * 5 张牌要组成顺子,则最多只能出现重复的两个 0,其余数字不可能重复,重复时直接返回 false
         * 由于 0 可以当作任意点数的牌,所以分情况讨论以理清思路:
         *     1. 零个 0:组成顺子时最大点数 - 最小点数 === 4
         *     2. 一个 0:如 0,5,7,8,9,由于 0 可以当作 6,则最大点数(9) - 最小点数(5) = 4
         *     3. 两个 0:如 0,0,6,7,8,由于 0 可以当作 4,5 或 9,10,此时最大点数(8) - 最小点数(6) = 2
         * 总结:当牌的最大点数 - 最小点数 <= 4 时即可组成顺子
         */
        Set<Integer> set = new HashSet<>();
        int max = 0;
        int min = 14;
        for (int num : nums) 
            // 如果是 0 则继续遍历,寻找最大点数和最小点数
            if (0 == num) 
                continue;
            
            // 判断当前元素是否重复,重复则直接返回 false
            if (!set.add(num)) 
                return false;
            
            max = Math.max(max, num);
            min = Math.min(min, num);
        
        return max - min <= 4;
    


题解二:

	/**
     * 剑指 Offer 61. 扑克牌中的顺子
     */
    public boolean isStraight(int[] nums) 
        /*
         * 先对数组进行排序,遍历数组的过程中统计大小王的个数,
         * 并判断除 0 外是否存在重复的点数,存在则直接返回 false
         * 注:数组排序完成之后,最大点数一定是 nums[4],最小点数一定是 nums[大小王数量]
         *     1. 不存在大小王的情况下最小点数一定是 nums[0],如 1,2,3,4,5
         *     2. 存在一个大小王情况下最小点数一定是 nums[1],如 0,1,2,4,5(因为 0 可以充当任何点数,那么一定充当比当前数组中最小点数还要大的数)
         *     3. 存在两个大小王情况下最小点数一定是 nums[2],如 0,0,2,4,5(因为 0 可以充当任何点数,那么一定充当比当前数组中最小点数还要大的数)
         */
        Arrays.sort(nums);
        int joker = 0;
        for (int i = 0; i < 4; i++) 
            // 统计大小王的数量
            if (nums[i] == 0) 
                joker++;
            
            // 存在重复点数
            else if (nums[i + 1] == nums[i]) 
                return false;
            
        
        // 最大点数与最小点数之差小于等于 4 则是顺子
        return nums[4] - nums[joker] <= 4;
    

限制:

  • 数组长度为 5
  • 数组的数取值为 [0, 13] .

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof

以上是关于[LeetCode]剑指 Offer 61. 扑克牌中的顺子的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]剑指 Offer 61. 扑克牌中的顺子

#yyds干货盘点#剑指 Offer 61. 扑克牌中的顺子

剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数

剑指 Offer 61. 扑克牌中的顺子

剑指offer61扑克牌中的顺子

算法剑指 Offer 61. 扑克牌中的顺子 重刷