剑指offer(C++)-JZ61:扑克牌顺子(算法-模拟)

news2025/1/9 1:24:46

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]

要求:空间复杂度 O(1),时间复杂度O(nlogn),本题也有时间复杂度O(n) 的解法

示例:

输入:

[6,0,2,0,4]

返回值:

true

说明:

中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true 

解题思路:

本题考察算法场景模拟。两种解题思路。

1)排序法

       将卡牌排序,复杂度O(nlogn),遍历一次O(n),记录0的数量,如果出现重复数据则中断返回false,对非0非重复数据进行间隔累加。如果最终0的数量大于等于间隔累加数,则说明可以形成顺子。

       比如2 0 4 0 0 7,排序后0 0 0 2 4 7,2和4间隔1,4和7间隔2,三个0刚好补齐,多余的0可以在前后凑顺子。

      如果0的数量和输入数量一致,则无法形成顺子。

      总的复杂度O(nlogn+n),即O(nlogn)。

2)查找法

       进行双层循环。发现0则跳过;通过set的count函数检测是否遇到重复,重复则返回false;无问题则插入数值,同时刷新最值。

       如果能持续到循环结束,此时最大值减去最小值的差值小于5,则一定能构成顺子,反之则不行。

       时间复杂度O(n2),遍历为n,查找为n,即n*n。

3)查找法进阶

       与查找法流程基本一致,区别在于检测重复值。因为卡牌最多只有0-14这15个数字,我们充分利用位运算特性,如果遇到某个数值,比如5,则将bm的第五位设为1,即0001 0000,每次遇到一个新数值就刷新bm。

       这样可以用&运算检测是否重复,只有某一位都为1,才会触发重复标识,进而返回false。用|运算刷新bm。

       时间复杂度O(n),遍历为n,查找为1,即n*1。

测试代码:

1)排序法

class Solution {
public:
    // 是否顺子
    bool IsContinuous(vector<int>& numbers) {
        // 排序法
        // 时间复杂度O(nlogn+n)=O(nlogn)
        // 快速排序
        sort(numbers.begin(), numbers.end());
        int size = int(numbers.size());
        int zeroNum = 0;
        int diff = 0;
        for(int i = 0; i < size; ++i){
            // 记录0的数量
            if(numbers[i] == 0){
                zeroNum++;
            } 
            // 判断是否有重复数据
            else if(i > 0 && numbers[i - 1] == numbers[i]){
                return false;
            }
            // 累加间隔长度,注意0不参与间隔计算
            else if(i > 0 && numbers[i - 1] != 0){
                // 比如2和3之间无多余间隔,则diff累加0;2和4之间有3这一个间隔,diff累加1
                diff += numbers[i] - numbers[i - 1] - 1;
            }
        }
        // 0的数量只有大于等于多余的间隔长度,才能凑成顺子
        if(zeroNum == size){
            return false;
        }
        else if(zeroNum >= diff){
            return true;
        }
        else{
            return false;
        }
    }
};

2)查找法

class Solution {
public:
    // 是否顺子
    bool IsContinuous(vector<int>& numbers) {
        // 查找法
        // 时间复杂度O(n2)
        int size = int(numbers.size());
        set<int> s;
        int minNum = 13;
        int maxNum = 0;
        for(int i = 0; i < size; ++i){
            // 跳过0
            if(numbers[i] == 0){
                continue;
            } 
            // 检查重复值,复杂度O(n)
            if(s.count(numbers[i])){
                return false;
            }
            // 插入
            s.insert(numbers[i]);
            // 刷新最值
            minNum = min(minNum, numbers[i]);
            maxNum = max(maxNum, numbers[i]);
        }
        // 最大值和最小值之差小于5,则一定能构成顺子
        bool result = (maxNum - minNum) < 5;
        return result;
    }
};

3)查找法进阶

class Solution {
public:
    // 是否顺子
    bool IsContinuous(vector<int>& numbers) {
        // 查找法进阶
        // 时间复杂度O(n)
        int size = int(numbers.size());
        int bm = 0;
        int minNum = 13;
        int maxNum = 0;
        for(int i = 0; i < size; ++i){
            // 跳过0
            if(numbers[i] == 0){
                continue;
            } 
            // 检查重复值,复杂度O(1)
            if((bm & (1 << numbers[i])) != 0){
                return false;
            }
            // 数字对应位改为1
            bm |= (1 << numbers[i]);
            // 刷新最值
            minNum = min(minNum, numbers[i]);
            maxNum = max(maxNum, numbers[i]); 
        }
        // 最大值和最小值之差小于5,则一定能构成顺子
        bool result = (maxNum - minNum) < 5;
        return result;
    }
};

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

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

相关文章

MyBatisPlus 基础Mapperr接口:增删改查

MyBatisPlus 基础Mapper接口&#xff1a;增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(user);}日志 数…

postman token 请求头添加

思路&#xff1a; 1、登录成功后将 得到的token设置为集合变量 2、在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm.response.json(); if(responseData.code 1) {// 获取tokenconst {data:{token}} responseData// 设置为集合变量pm.colle…

Java8中List转Map报错“java.lang.IllegalStateException: Duplicate key”

排查思路 从报错的关键字中可以大致判断是是key冲突,Duplicate key在数据库的主键冲突错误中经常遇到&#xff0c;个人的思维惯性就联想到了数据库,从这个方向去排查,无果。抓耳挠腮之下&#xff0c;分析如下错误信息 java.lang.IllegalStateException: Duplicate key image(…

java八股文面试[数据库]——索引哪些情况下会失效

查询条件包含 or&#xff0c;会导致索引失效。 隐式类型转换&#xff0c;会导致索引失效&#xff0c;例如 id字段类型是varchar&#xff0c;我们 where id 1&#xff0c;这样就会触发隐式类型转换 like 通配符会导致索引失效&#xff0c;注意:”ABC%” 不会失效&#xff0c;…

问道管理:华为产业链股再度拉升,捷荣技术6连板,华力创通3日大涨近70%

华为产业链股6日盘中再度拉升&#xff0c;到发稿&#xff0c;捷荣技能涨停斩获6连板&#xff0c;华映科技亦涨停收成3连板&#xff0c;华力创通大涨超19%&#xff0c;蓝箭电子涨约11%&#xff0c;力源信息涨超4%。 捷荣技能盘中再度涨停&#xff0c;近7日已累计大涨超90%。公司…

如何成为一个高效的电商数据分析师

如何成为一个高效的电商数据分析师 文章目录 如何成为一个高效的电商数据分析师前言市场洞察平台品类品牌淘天京东抖音 商品 总结 前言 电商数据分析师 在我看来这个角色的定义其实很宽泛&#xff0c;现在从事电商这门生意的人都可以是&#xff0c;而且应该是一名电商数据分析师…

[BSidesCF 2019]Kookie 1 , cookie伪造

给了一个用户和密码 用户名&#xff1a;cookie 密码&#xff1a;monster 登录后查看cookie 发现就是用户名维持登录 那么修改用户名为 admin 得到flag

原型-设计模式

原型设计模式 原型模式应用场景&#xff1a;创建一个对象比较复杂&#xff0c;当前存在一个和需要创建的对象极其相似&#xff0c;我们就可以采用原型模式&#xff0c;在原来的对象上进行一个修改。 修改方案&#xff1a;在原来的基础上进行拷贝&#xff0c;在进行部分的修改。…

Pytest系列-快速入门和基础讲解(1)

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架 单元测试框架介绍 单元测试…

【Arduino24】8*8点阵实验

硬件准备 8*8点阵&#xff1a;1个 旋钮电位器&#xff1a;1个 面包板&#xff1a;1块 杜邦线&#xff1a;若干 硬件连线 软件程序 //定义引脚 #define xKnob_pin A0 //x轴旋钮的引脚 #define yKnob_pin A1 //y轴旋钮的引脚 const int row_pin[8] { 6, 11, 10, 3, 17, 4…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

playwright 录制脚本执行时出现文件编码错误 SyntaxError

playwright 录制脚本执行时出现文件编码错误 SyntaxError 问题描述&#xff1a; 使用playwright 进行脚本录制&#xff0c;录制的过程中&#xff0c;某些元素的定位方式由中文确认&#xff0c;脚本录制完成后&#xff0c;执行脚本报错&#xff0c;出现 SyntaxError: (unicode e…

无涯教程-JavaScript - BESSELK函数

描述 BESSELK函数返回修改后的Bessel函数Kn(x),该函数等效于针对纯虚参判断的Bessel函数。 这些也称为双曲贝塞尔函数。 语法 BESSELK(X, N)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.RequiredNThe order of the function. If n i…

Docker实战:docker compose 搭建Sonar

1、docker-compose-sonar文件准备 进入/home/docker目录&#xff0c;新建docker-compose-sonar.yml文件&#xff0c;内容如下&#xff1a; version: 3 services: sonar:image: sonarqube:8.9.6-communityrestart: always container_name: sonarqubevolumes:# 设置与宿主机时间…

string容器的常用操作

string容器的常用操作 一、C语言中的字符串二、string容器1、概念2、特点 三、string类对象的常见构造1、构造2、实际构造函数3、测试代码4、运行结果 四、赋值运算符1、类型2、作用3、测试代码4、运行结果 五、string类对象的容量操作1、成员函数2、测试代码3、说明4、运行结果…

第二十章 ObjectScript - 潜在的缺陷

文章目录 第二十章 ObjectScript - 潜在的缺陷 第二十章 ObjectScript - 潜在的缺陷 以下项目可能会让刚接触ObjectScript的程序员感到困惑&#xff0c;特别是那些负责维护其他程序员编写的代码的程序员: 在例程或方法中&#xff0c;除非每行包含标签&#xff0c;否则每行必须…

复制粘贴是怎么实现的

在上面的代码中&#xff0c;command 和 select 是自定义的函数。它们的作用如下&#xff1a; 实现复制粘贴的思路&#xff1a; 创建一个 textarea 标签将 textarea 移出可视区域给这个 textarea 赋值将这个 textarea 标签添加到页面中调用 textarea 的 select 方法调用 docum…

【PowerDesigner16】显示工具面板

1、点击左上角【工具】“toolbars”&#xff0c;然后【自定义工具栏】&#xff0c;选择“palette”即可显示工具栏。

MediaCodec源码分析 createByCodecName流程

前言 本文梳理MediaCodec初始化流程,即create流程,基于7.0代码。流程图如下,创建流程还是比较清晰简单的。 代码见: frameworks/base/media/java/android/media/MediaCodec.java frameworks/base/media/jni/android_media_MediaCodec.h frameworks/base/media/jni/androi…

源代码防泄密

IBM 发布年度《数据泄露成本报告》&#xff0c;显示 2023 年全球数据泄露平均成本达到 445 万美元&#xff0c;比过去 3 年增加了 15%。创下该报告的历史新高。 报告显示&#xff0c;企业在计划如何应对日益增长的数据泄露频率和成本方面存在分歧。研究发现&#xff0c;虽然 95…