剑指offer61.扑克牌中的顺子

news2024/11/28 7:28:02

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

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。

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;在遍历的同时不断更新最大数和最小数,最后也是最大数-最小数判断。

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 则可构成顺子
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode面试题 判断字符是否唯一

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;判断字符是否唯一 思路&#xff1a; a - z 的 ASCII 区间在 [97 , 122] 当中的每个减去 97 或者 a 都会变成 0 - 25&#xff0c;所以只需要一个数组&#xff0c;用当前元素减去 97 97 97 的下标来记录当前字母出现的次数…

微软、OpenAI用上“数据永动机” 合成数据是晨曦还是暮光?

微软、OpenAI、Cohere等公司已经开始测试使用合成数据来训练AI模型。Cohere首席执行官Aiden Gomez表示&#xff0c;合成数据可以适用于很多训练场景&#xff0c;只是目前尚未全面推广。 已有的&#xff08;通用&#xff09;数据资源似乎接近效能极限&#xff0c;开发人员认为&a…

volatile轻量级锁

一、背景 我们在写项目的时候&#xff0c;有时会使用多线程。为了保证一部分线程之间的通信&#xff0c;所以需要线程中的一些变量具有可见性。 说到线程可见性&#xff0c;对于Java而言&#xff0c;有两种方法实现&#xff1a;volatile和synchronized。 需要注意的是&#…

Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化...

原文链接&#xff1a;http://tecdat.cn/?p23689 本文探索Python中的长短期记忆&#xff08;LSTM&#xff09;网络&#xff0c;以及如何使用它们来进行股市预测&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 在本文中&#xff0c;你将看到如何使用…

BART模型和 Electra模型对比

总结 Electra模型在使用较少的计算资源的情况下能够达到跟大语言模型相近的效果。但BART模型对于传统的BERT中加入了不同种制造noise的方式&#xff0c;是BERT和GPT的结合体。Electra模型主要是Generator模型和Discriminator模型的结合体。 未知参数设置&#xff0c;两个模型…

【Spring Boot】事务的隔离级别与事务的传播特性详解:如何在 Spring 中使用事务?不同隔离级别的区别?

文章目录 1 事务1.1 事务简介与 mysql 中的事务使用1.2 Spring 编程式事务&#xff08;手动操作&#xff09;1.3 Spring 声明式事务&#xff08;自动操作&#xff09;1.4 Transactional 的工作原理 2 事务的隔离级别2.1 事务的四大特性及事务的隔离级别回顾2.2 Spring 事务的隔…

【Unity2D】相机移动以及设置相机边界

添加相机 添加相机时&#xff0c;首先需要在unity中添加 Cinemachine 包 第一次使用这个包时&#xff0c;需要在Package Manager中搜索并安装 安装Camera Mechine包后&#xff0c;添加2D Camera 设置跟随对象为Ruby &#xff08;从Hierarchy中将Ruby拖动到Follow中&#xff0…

非线性质量弹簧阻尼器的神经网络仿真研究(Matlab代码Simulink仿真实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、Simulink仿真实现 &#x1f4a5;1 概述 非线性质量弹簧阻尼器&#xff08;Nonlinear Mass-Spring-Damper&#xff0c;NMSD&#xff09;是一种常见的振动控制装置&#…

VS2017找不到QT头文件

一、我的电脑右键属性 - 》“高级系统设置” -》“环境变量” 增加环境变量Qt_INCLUDEPATH_ 值为QT的头文件目录 二、重启VS 发现波纹线不见了&#xff0c;证明设置环境变量后VS能识别到QT头文件了 原理是&#xff1a;vs导入qt项目附加包含目录继承值有Qt_INCLUDEPATH_

【视频的动态对比】

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言图像修复人脸与关键点检测修复图像修复视频 动态对比添加声音获取原视频音频融合声…

elementui全局给select option添加title属性

场景 有天边上的同事问了我一个问题&#xff0c;示例如下&#xff0c;有个数据特别长&#xff0c;导致下拉部分被横向撑大。希望在全局对所有的option进行处理&#xff0c;按照select的宽度&#xff0c;超出隐藏。 处理 方式一 第一眼看过去直接修改源码好了&#xff0c;修…

Mybatis基础模块-日志管理

文章目录 1. 适配器模式2. Log2.1 默认实现StdOutImpl2.2 Log4jImpl 3. LogFactory4. 解析配置和应用4.1 settings配置4.2 解析 5. jdbc日志5. 1 类图5.2 BaseJdbcLogger5.3 ConnectionLogger5.4 ConnectionLogger的具体应用 1. 适配器模式 适配器使接口不兼容的对象可以相互合…

用QFramework来重构 祖玛游戏

资料 Unity - 祖玛游戏 GitHub 说明 用QF一个场景就够了&#xff0c;在UIRoot下切换预制体达到面板切换。 但测试中当然要有一个直接跳到测试面板的 测试脚本&#xff0c;保留测试Scene&#xff08;不然初学者也不知道怎么恢复测试Scene&#xff09;&#xff0c;所以全文按S…

SpringBoot整合Spring Security实现权限控制

文章目录 Spring Security介绍Spring Security案例1、快速搭建一个springboot工程2、导入SpringSecurity整合springboot工程3、认证3.1、登录流程校验3.2、入门案例的原理3.3、实现思路3.4、实现认证流程&#xff08;自定义&#xff09;3.5、正式实现3.5.1 实现数据库的校验3.5…

Linux 内核 ASoC 基本数据结构

Linux 内核 ASoC 框架建立了新的抽象&#xff0c;并通过一些中间层&#xff0c;将这些抽象接入 ALSA 音频框架。 Linux 内核 ASoC 设备驱动的结构如下图&#xff1a; Linux 内核 ASoC 设备驱动程序在 Linux 内核中扮演多个角色。 Linux 内核 ASoC 设备驱动程序在初始化阶段向…

MATLAB遗传算法求解带容量约束的物流配送选址问题实例

MATLAB遗传算法求解带容量约束的物流配送选址问题实例 作者&#xff1a;麦哥爱西芹 MATLAB遗传算法求解带容量约束物流配送中心选址问题代码实例 遗传算法编程问题实例&#xff1a; 在经度范围为(116, 118)&#xff0c;纬度范围为(38, 40)的矩形区域内&#xff0c;散布着37个需…

第116天:免杀对抗-EDRSyscall-hookDLL反射注入白加黑隐写分离加载器

知识点 #知识点&#xff1a; 1、DLL劫持-自写&导入 2、DLL劫持-重写&分离 3、syscall-底层&项目#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 …

常微分方程建模R包ecode(一)——构建常微分方程系统

常微分方程在诸多研究领域中有着广泛应用&#xff0c;本文希望向大家介绍笔者于近期开发的R包ecode&#xff0c;该包采用简洁易懂的语法帮助大家在R环境中构建常微分方程&#xff0c;并便利地调用R图形接口&#xff0c;研究常微分方程系统的相速矢量场、平衡点、稳定点等解析性…

基于linux下的高并发服务器开发(第二章)- 2.20 kill、raise、abort函数

03 / 信号的5种默认处理动作 当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff0c;这种行为就叫做Core Dump&#xff08;中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”&#…

X86设备启动过程

文章目录 一、电源自检二、BIOS自检三、引导设备选择四、主引导记录4.1 0x7c0 五、加载操作系统 x86计算机启动过程&#xff0c;主要分为这几个阶段&#xff1a;电源自检、BIOS自检、引导设备的选择、主引导记录、加载操作系统。 一、电源自检 当我们按下开关键后&#xff0c;…