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

这篇具有很好参考价值的文章主要介绍了剑指 Offer ! 61. 扑克牌中的顺子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料:力扣K神的讲解

剑指 Offer 61. 扑克牌中的顺子
简单
351
相关企业
从若干副扑克牌中随机抽 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] .

思路:
注意到 ‘0’(即大王、小王)的出现次数只有三种情况:

  1. ‘0’不出现
    此时,可行数组(顺子)的最大值与最小值之差 为 4
  2. ‘0‘出现一次
    此时,可行数组(顺子)的最大值与最小值之差 <= 4
  3. ’0‘出现两次
    此时,可行数组(顺子)的最大值与最小值之差 <= 4
    所以,顺子应该满足“除了0之外,最大值与最小值之差 < 5”这个数学规律。
    此外,常识告诉我们:顺子不该有重复值。
    综上,
    检查 数组是否可行(顺子)等价于
    检查 “除了0之外,最大值与最小值之差 < 5” 和 ”无重复值“ 这两个条件是否同时满足。

解法一:集合+找最大值和最小值

使用集合检查数组中是否有重复值;

  public boolean isStraight(int[] nums) {
        Set<Integer> repeat = new HashSet<>();
       
        int min=14;
        int max=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==0){                
                continue;
            }
            min = Math.min(nums[i],min);
            max=Math.max(nums[i],max);

            if(repeat.contains(nums[i])){
                return false;
            }
            repeat.add(nums[i]);

        }
        return max-min<5;
    }

解法二:排序+记录0的个数

 public boolean isStraight2(int[] nums) {
      
        Arrays.sort(nums);
        int count0=0;
        for(int i=0;i<nums.length-1;i++){
            if(nums[i]==0) {
                count0++;
                continue;
            }
            if(nums[i]==nums[i+1]) return false;// Repeat!!
    
        }
        // 遍历完成后,count0 就是 数组最小值所在位置
        return nums[4]-nums[count0]<5;
    }

解法三:排序+记录0的个数+记录空缺数字的个数(自己写的つ﹏⊂)

我没有观察出来那个数学规律……
这个解法的思路很朴素。
首先排序,然后遍历数组,数一下有多少”0“(作为救命稻草),有多少”缺失值“(作为坑);
遍历结束之后,看看 这些救命稻草 够不够 填补这些坑。文章来源地址https://www.toymoban.com/news/detail-647206.html

 public boolean isStraight1(int[] nums) {
        Arrays.sort(nums);
        int count0=0;// count 0
        int cnt=0;// count all the missing values
        for(int i=0;i<5-1;i++){
            if(nums[i]==0){
                 count0++;
            }else{
                if(nums[i]==nums[i+1]-1){
                    continue;
                }
                if(nums[i]==nums[i+1]) return false;// repeat! 
    
                cnt+=nums[i+1]-nums[i]-1;
                // say, [2,3],nums[i+1]-nums[i]-1=3-2-1=0, means no missing value bwt 2 and 3
                // say, [4,6], nums[i+1]-nums[i]=6-4-1=1, means there exists one missing value bwt 4 and 6
            }

        }
        return count0>=cnt;// check if all available 0 could satisfy the demand of all missing values 

    }

到了这里,关于剑指 Offer ! 61. 扑克牌中的顺子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java-扑克牌的创建以及发放

    大家好,我是晓星航。今天为大家带来的是 Java-扑克牌的创建以及发放的讲解!😀 这为后续扑克牌的花色以及数字大小创建了类。 这里我们写好了我们扑克牌的基本菜单逻辑,即买牌(52张),再洗牌(打乱牌),最后将所有牌分发给玩游戏的三个人(每人五张)。 这里我们定义了

    2024年02月01日
    浏览(45)
  • 如何用Java实现扑克牌(附源码)

    目录 一.扑克牌的数据结构  二.买牌(扑克牌的初始化) 三.洗牌 四.发牌 五.完整代码 Card.java CardList.java 六.测试 输出结果  首先,扑克牌是一幅一幅的,除去大小王以外一共有 52 张,我们可以考虑用数组来存储,数组的每一个元素都是一张牌,这是牌库的牌;除了要考虑牌库

    2024年02月04日
    浏览(42)
  • 数据库编程大赛:一条SQL计算扑克牌24点

    你是否在寻找一个平台,能让你展示你的SQL技能,与同行们一较高下?你是否渴望在实战中提升你的SQL水平,开阔你的技术视野?如果你对这些都感兴趣,那么本次由NineData主办的《数据库编程大赛》,将是你的最佳选择! 本次数据库编程大赛的奖项安排:一等奖(1人)、二

    2024年02月03日
    浏览(45)
  • 张泽鹏:用PostgreSQL征服24点扑克牌算法的数据库高手

    参赛选手 :张泽鹏 个人简介 :杭州隐函科技有限公司联创,技术负责人 参赛数据库 :PostgreSQL 性能评测 :百万级数据代码性能评测 2.46秒 综合得分 :82.2 以下是张泽鹏选手的代码说明思路简介: 本算法用了取巧的方法:提前计算好4个1~10数值求24的结果,执行查询时,直

    2024年02月02日
    浏览(49)
  • python123输出N以内的所有素数&哥德巴赫猜想&扑克牌游戏

    描述 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬ 编程找出N(即小

    2023年04月18日
    浏览(42)
  • 【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年02月21日
    浏览(45)
  • 小啊呜产品读书笔记001:《邱岳的产品手记-16》第30讲产品案例分析:Primer的扑克牌交互 & 第31讲 产品分析的套路(下):如何出解决方案?

    叮嘟!这里是小啊呜的产品进阶读书笔记整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧! Google 出品的 Primer,让你 5 分钟学市场营销 (1)这种交互方式看起来很像在玩儿扑克牌,所以我们就姑且管它叫 扑克牌交互 ,这其实也是 卡片设计 的一种。

    2024年02月07日
    浏览(49)
  • 【剑指offer】数据结构——数组

    【剑指offer】03.数组中重复的数字 //03. 数组中重复的数字 // 找出数组中重复的数字。 // 力扣 // 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 // 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每 // 个数字重复了几次。请找出数组中任意一

    2024年02月08日
    浏览(40)
  • 剑指 Offer 12 矩阵中的路径

    题目: 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重

    2024年02月09日
    浏览(57)
  • 剑指offer12.矩阵中的路径

     太难了,想了一会儿没有头绪就直接看了题解。 题解用的是回溯算法,check(i,j,k)表示从board[i][j]位置开始能否搜索到word第k个字符后面的字串,能搜索到返回true否则返回false。如果board[i][j] != word[k] 返回false。如果相等且是最后一个字符返回true,如果相等但不是最后一个字符

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包