剑指offer61.扑克牌中的顺子

我的想法非常简单,就是先给数组排序,然后统计里面有几个0,然后遍历数组,如果是0或者比后面一个数小1就直接进入下一次循环,如果比后面一个数小2,就用掉一个0,0的数量减1,如果比后面的数小2就用两个0,0的数量减2,其他情况直接返回false,最后看0的数量,如果小于0,返回false,否则返回true;排序方法我写了两种,写冒泡是因为简单,写快排是想练习一下快排。

java 复制代码
class Solution {
    public boolean isStraight(int[] nums) {
        //bableSort(nums);
        quickSort(nums, 0, nums.length-1);
       int zeroNums = 0;
       if(nums[0] == 0)zeroNums++;
       if(nums[1] == 0)zeroNums++;
           for(int i =0;i<nums.length-1;i++){
               if(nums[i]==0 || nums[i+1] - nums[i] == 1){
                   continue;
               }else if(nums[i+1] - nums[i] == 2){
                   zeroNums--;
               }else if(nums[i+1] - nums[i] == 3){
                   zeroNums-=2;
               }else{
                   return false;
               }
           }
           if(zeroNums < 0)return false;
           return true;
       
    }
    public void bableSort(int[] nums){
        int n = nums.length;
        int tmp =0;
        for(int i =0;i<n;i++){
            for(int j = i+1;j<n;j++){
               if(nums[i] > nums[j]){
                   tmp = nums[i];
                   nums[i] = nums[j];
                   nums[j] = tmp;
               }
            }
        }
    }

    public void quickSort(int[] nums, int l, int r){
        if(l>=r) return;
        int i = l; int j =r;
        int key = nums[i];
        while(i<j){
            while(key <= nums[j] && i<j)j--;
            while(nums[i] <= key && i<j)i++;
            if(i<j){
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            }
        }
        nums[l] = nums[i];
        nums[i]= key;
        quickSort(nums, l, i-1);
        quickSort(nums, i+1, r);
    }
     
}

看了题解发现自己的解法确实挺傻逼的,这道题有一个关键点就是,如果在没有重复的情况下数组中的最大的数-最小的数 < 0 就说明可以成为顺子;如果重复了就直接返回false。所以有两种题解,一种是先排序然后遍历,如果是0, joker的数就+1(joker初始数量为0),如果和后面的数相等就返回fasle,这两个判断不能反。最后最大数-最小数,最大数就是nums[4],最小数是nums[joker],如果小于5就返回true。

java 复制代码
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 则可构成顺子
    }
}

还有一种是不排序直接遍历的,把遍历的数放到set里面,如果是0直接跳过;如果set里面有这个数就重复了,直接返回false;在遍历的同时不断更新最大数和最小数,最后也是最大数-最小数判断。

java 复制代码
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 则可构成顺子
    }
}
相关推荐
.格子衫.3 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多3 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
Swift社区4 小时前
LeetCode 394. 字符串解码(Decode String)
算法·leetcode·职场和发展
tt5555555555554 小时前
LeetCode进阶算法题解详解
算法·leetcode·职场和发展
让我们一起加油好吗5 小时前
【基础算法】DFS中的剪枝与优化
算法·深度优先·剪枝
Jabes.yang5 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪5 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
Q741_1475 小时前
C++ 模拟题 力扣495. 提莫攻击 题解 每日一题
c++·算法·leetcode·模拟
兮动人5 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR225 小时前
Spring IOC(控制反转)中常用注解
java·spring