LeetCode(剑指 Offer)- 61. 扑克牌中的顺子

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 61. 扑克牌中的顺子相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:

解题思路

相关企业

  • 字节跳动

AC 代码

  • Java
// 解决方案(1)
class Solution 
    public boolean isStraight(int[] nums) 
        Set<Integer> repeat = new HashSet<>();
        int max = 0, min = 14;
        for(int num : nums) 
            if(num == 0) continue; // 跳过大小王
            max = Math.max(max, num); // 最大牌
            min = Math.min(min, num); // 最小牌
            if(repeat.contains(num)) return false; // 若有重复,提前返回 false
            repeat.add(num); // 添加此牌至 Set
        
        return max - min < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
    


// 解决方案(2)
class Solution 
    public boolean isStraight(int[] nums) 
        int joker = 0;
        Arrays.sort(nums); // 数组排序
        for(int i = 0; i < 4; i++) 
            if(nums[i] == 0) joker++; // 统计大小王数量
            else if(nums[i] == nums[i + 1]) return false; // 若有重复,提前返回 false
        
        return nums[4] - nums[joker] < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
    


// 解决方案(3)
class Solution 
    public boolean isStraight(int[] nums) 
        // 计数排序思想
        int[] count = new int[14];
        for (int i = 0; i < nums.length; i++) 
            count[nums[i]]++;
            if (count[nums[i]] > 1 && nums[i] != 0) 
                return false;
            
        

        // 查找左右区间
        boolean flagL = true, flagR = false;
        int idxL = -1, idxR = -1;
        for (int i = 1; i < count.length; i++) 
            if (flagL && count[i] == 1) 
                idxL = i;
                flagL = false;
                flagR = true;
             else if (flagR && count[i] == 1) 
                idxR = i;
            
        

        // 计算缺少坑位数
        int needCnt = 0;
        for (int i = idxL; i <= idxR; i++) 
            if (count[i] == 0) 
                needCnt++;
            
        

        return needCnt <= count[0];
    
  • C++
// 解决方案(1)
class Solution 
public:
    bool isStraight(vector<int>& nums) 
        unordered_set<int> repeat;
        int ma = 0, mi = 14;
        for(int num : nums) 
            if(num == 0) continue; // 跳过大小王
            ma = max(ma, num); // 最大牌
            mi = min(mi, num); // 最小牌
            if(repeat.find(num) != repeat.end()) return false; // 若有重复,提前返回 false
            repeat.insert(num); // 添加此牌至 Set
        
        return ma - mi < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
    
;

// 解决方案(2)
class Solution 
public:
    bool isStraight(vector<int>& nums) 
        int joker = 0;
        sort(nums.begin(), nums.end()); // 数组排序
        for(int i = 0; i < 4; i++) 
            if(nums[i] == 0) joker++; // 统计大小王数量
            else if(nums[i] == nums[i + 1]) return false; // 若有重复,提前返回 false
        
        return nums[4] - nums[joker] < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
    
;

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

LeetCode(剑指 Offer)- 61. 扑克牌中的顺子

[LeetCode]剑指 Offer 05. 替换空格

[LeetCode]剑指 Offer 52. 两个链表的第一个公共节点

LeetCode(剑指 Offer)- 56 - I. 数组中数字出现的次数

LeetCode(剑指 Offer)- 56 - I. 数组中数字出现的次数

[LeetCode]剑指 Offer 05. 替换空格