剑指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 则可构成顺子
    }
}
相关推荐
Lionel_SSL1 小时前
《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
java·开发语言·jvm
记得开心一点嘛1 小时前
手搓Springboot
java·spring boot·spring
Greedy Alg2 小时前
LeetCode 142. 环形链表 II
算法
睡不醒的kun2 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
老华带你飞2 小时前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
独行soc2 小时前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
脑子慢且灵2 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web
先做个垃圾出来………2 小时前
残差连接的概念与作用
人工智能·算法·机器学习·语言模型·自然语言处理
华仔啊3 小时前
SpringBoot 中 6 种数据脱敏方案,第 5 种太强了,支持深度递归!
java·后端
SuperCandyXu4 小时前
P3205 [HNOI2010] 合唱队-普及+/提高
c++·算法·洛谷