【LeetCode】剑指 Offer 61. 扑克牌中的顺子 p298 -- Java Version

2023-05-16

题目链接:https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/

1. 题目介绍(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

【条件约束】:

限制

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

2. 题解

2.1 排序 + 遍历 – O(nlogn)

时间复杂度O(nlogn),空间复杂度O(1)
在这里插入图片描述

解题思路】:
阅读该题示例,我们就能很容易的发现该题和真实世界中的扑克牌顺子还是有所区别的,区别在于:A 与 2 是作为数字 1 与 2 来和 3、4、5组成顺子,而不是真实世界中与 J、Q、K组成顺子,且 大小王可以作为万能牌 来代替其它任意数字,也正是因为这点区别,反而降低了题目的难度。
……
明白了以上思路,我们只需要做 3 件事情即可解题:

  1. 首先把数组排序(即 单调递增);
  2. 其次统计数组中 0 的个数(即 万能牌的个数);
  3. 最后统计排序之后的数组中相邻数字之间的空缺总数,如果空缺的总数小于或等于 0 的个数,说明数组连续,否则数组则不连续。

……
实现策略】:
根据以上分析,我们很容易就能得到编程思路:

  1. 首先进行无效输入判断;
  2. 使用库函数 sort() 对数组进行排序,该排序的时间复杂度为 O(nlogn);
  3. 遍历数组,统计数组中 0 的个数;
  4. 统计数组中达成顺子空缺的间隔数
  5. 对比空缺数与0的个数,如果空缺>0的个数,说明不是顺子。
class Solution {
    // Solution 1.1:排序 + 遍历
    // 1. 对数组进行排序
    // 2. 统计数组中0的个数
    // 3. 统计数组中达成顺子空缺的间隔数
    public boolean isStraight(int[] nums) {
        // 无效输入判断
        if (nums.length <= 0) return false;
        // 对数组进行排序
        Arrays.sort(nums);

        int arraysZeroNum = 0;
        int arraysGapNum = 0;

        // 遍历数组,统计数组中0的个数
        for (int i = 0; i < nums.length; i++) {
            // 因为数组已经经过排序,所以遇到不为0的数时,可以直接结束循环
            if (nums[i] != 0) break;
            arraysZeroNum++;
        }

        // 统计数组中达成顺子空缺的间隔数
        int small = arraysZeroNum;  // 第一个不为0的元素的下标
        int big = small + 1;
        while (big < nums.length) {
            // 出现重复数字,一定不是顺子
            if (nums[small] == nums[big]) return false;

            // 排序是单调递增,因此后面的数都比前面的要大
            arraysGapNum += nums[big] - nums[small] - 1;
            small = big;
            big++;
        }

        // 对比空缺数与0的个数,如果空缺>0的个数,说明不是顺子
        return (arraysGapNum > arraysZeroNum) ? false : true;
    }
}

在这里插入图片描述

代码简化:】:
Solution 1.2 为对 Solution 1.1的代码简化,具体简化如下:

  1. 将判重与统计万能牌的遍历合并在了一起;
  2. 省略了 Solution 1.1 中对数组中顺子空缺数的统计,转而使用 最大牌 - 最小牌 < 5 这一条件表达式代替,极大的简化了代码。
class Solution {
    // Solution 1.2:排序 + 遍历 简化版
    // 简化:将逐一计算数字中数字的空缺数改为直接用 最大牌 - 最小牌 < 5 的方式
    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. 参考资料

[1] 面试题61. 扑克牌中的顺子(集合 Set / 排序,清晰图解)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode】剑指 Offer 61. 扑克牌中的顺子 p298 -- Java Version 的相关文章

  • Java中如何动态添加charsequence[]中的数据?

    初始化的一种方法charsequence is charsequence item abc def 但我不想以这种方式初始化它 有人可以建议其他方式吗 比如我们初始化的方式string arrays 首先 修复变量声明 charsequen
  • 在java中将RFC3339 DateTime转换为Date [重复]

    这个问题在这里已经有答案了 如何转换RFC 3339 https www rfc editor org rfc rfc3339java 中的 com google api client util DateTime 到 DateTime 例如
  • 使用 Intellij 2017.2 /out 目录构建会重复 /build 目录中的文件

    更新到 Intellij 2017 2 后 构建我的项目会创建一个 out包含生成的源文件和资源文件的目录 这些文件与已包含的文件重复 build并导致duplicate class生成的类的编译器错误 关于 Gradle 或 Intell
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • 在 Java Swing 元素中使用 HTML 样式是不好的做法吗?

    使用 HTML 设置 Swing 元素的样式被认为是不好的做法吗 举个例子 如果我想让标签变大并变红一次 我有两个选择 使用 API 调用 JLabel label new JLabel This is a title label setF
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 如何找到 Oracle 数据库的 URL?

    如何找到 Oracle 数据库的 URL 和端口 Example jdbc oracle thin host port dbName 用户名 密码 是否有我可以查看的 SQL 命令或日志 配置文件 对于甲骨文来说 有一个tnsnames o
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • 将字符串转换为字符并按降序排序(ascii)

    我正在创建一个程序 该程序将使用户输入整数 一个接一个 存储在数组中并按降序显示整数 该程序还要求用户输入一个字符串 使用以下命令将其转换为字符string toCharArray 我已经正确地按降序显示整数 问题是我不知道如何按降序显示字
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐