【牛客 - 剑指offer】JZ61 扑克牌顺子 两种方案 Java实现

news/2024/5/19 8:33:05/文章来源:https://blog.csdn.net/guliguliguliguli/article/details/127020902

文章目录

  • 剑指offer题解汇总 Java实现
  • 本题链接
  • 题目
  • 方案一 哈希表
  • 方案二 排序


剑指offer题解汇总 Java实现

https://blog.csdn.net/guliguliguliguli/article/details/126089434

本题链接

知识分类篇 - 模拟 - JZ61 扑克牌顺子

题目

在这里插入图片描述
题目主要信息

  • 两副扑克牌抽五张,判断是否为顺子
  • A为1,J为11,Q为12,K为13
  • 大、小王为0,0可以看作任意牌

方案一 哈希表

哈希表

哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构,而这种直接访问意味着只要直到key就能在 O(1) 时间内得到value,因此,哈希表常用来统计频率、快速检验某个元素是否出现过等。

思路

题中给出的信息是两副牌,因此最多4个零,因此必有一张非零牌,分析顺子两点基本情况:

  • 不能由重复的非零牌

  • 非零牌之间最大相差为4(也就是说,中间还有三个位置,可以填上三个数,让这五个牌成为顺子)

可以找到这手牌的最大差值

  • 若是两张非零牌最大相差大于4,则需要更多的牌(大于三张)来填充中间的部分

  • 若是小于等于4,又不重复的情况下,要么零牌补齐,要么本身就是相邻的数字

举几个例子
0 0 0 1 2
0 0 0 1 5
0 0 2 3 5

因此创建一个哈希表,查找重复:遍历数组的同时,遇到非零牌重复,直接return false,若没有重复,则加入哈希表中,等待后序的查找。同时在遍历过程中需要记录数组的最大值与最小值,最后检查最大值与最小值的差是否大于4,小于4的话,在没有 非零牌重复的情况下,最大值与最小值中间的牌加上0牌就可以填满这手顺子

一共五张扑克牌,只要最大值和最小值之间的距离小于等于4,那么不管是用非零牌,还是零牌,都可以构成顺子,构成顺子的有可能是零牌,也可能就是最大最小值之间的数本身

具体步骤

  1. 创建一个哈希表,统计这手牌有无非零重复牌
  2. 使用两个变量记录这手牌的上下界
  3. 遍历每一张牌,零牌可以重复,非零牌重复则不能为顺子。用哈希表检查去重
  4. 将新牌加入哈希表,并更新这手牌的上下界
  5. 最后检查上下界之差是否大于5,若是,则构不成顺子,否则,可以。
import java.util.HashMap;public class Solution {public boolean IsContinuous(int[] numbers) {int minValue = 100;int maxValue = -1;HashMap<Integer, Integer> map = new HashMap<>();for (int number : numbers) {//非零牌if (number != 0) {//非零牌重复,return falseif (map.containsKey(number)) {return false;}map.put(number, 1);//记录最大值if (number > maxValue) {maxValue = number;}//记录最小值if (number < minValue) {minValue = number;}}}return maxValue - minValue <= 4;}
}

方案二 排序

对数组先进行排序,这样如果有零牌,那么都会在数组的最前面

遍历数组,计算零牌出现的次数,以及当非零牌不止一个时,计算相邻两张非零牌之间的间隔,若间隔数大于零牌数,则不能组成顺子

就比如

【 0 0 0 2 4 】
2和4之间的间隔是1 ,零牌有3张,可以构成顺子
【 0 2 4 5 7 9】
2和4之间的间隔是1,5和7之间的间隔是1,7和9之间的间隔是1,零牌只有1张,无法构成顺子

import java.util.Arrays;public class Solution {public boolean IsContinuous(int[] numbers) {Arrays.sort(numbers);//用于记录五个数中0出现的次数int zeros = 0;//用于记录所有的相邻两个数之间还能塞下几个数//比如1 3 4 5 6,cnt2 = 1,因为只有1和3之间还能塞下2int gap = 0;for (int i = 0; i < numbers.length; i++) {if (numbers[i] == 0) {zeros++;continue;}if (i != 0 && numbers[i] == numbers[i - 1]) {return false;}if (i != 0 && numbers[i - 1] != 0) {if (numbers[i] - numbers[i - 1] > 1) {gap += (numbers[i] - numbers[i - 1] - 1);}}}return gap <= zeros;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理之直方图均衡

直方图均衡是一种将图像中的灰度分布转换成均匀分布&#xff0c;从而增强图像的对比度的图像处理方法。直方图均衡可以将原本偏白或者偏黑的图像转换成对比度符合人眼视觉的图像。 1 原理 连续空间   连续空间内的图像灰度r∈[0,L−1]&#xff0c;L表示灰度级r\in[0,L-1]&a…

上线记 | 人大金仓助力东莞卫生健康领域核心系统改造升级

随着人工智能、云计算、大数据、机器学习等新兴技术在医疗信息化建设中不断深入&#xff0c;以患者为中心、构建智慧医院、提升医院信息智能化问题迫在眉睫。为进一步深化医改工作&#xff0c;加强妇幼卫生信息管理&#xff0c;东莞市卫生健康局对东莞妇幼卫生信息平台进行了国…

[leetcode top100] 0923 多数元素,反转链表,翻转二叉树,回文链表,移动零

目录 169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 283. 移动零 - 力扣&#xff08;Le…

2106. 摘水果(每日一难phase-day22)

2106. 摘水果 在一个无限的 x 坐标轴上&#xff0c;有许多水果分布在其中某些位置。给你一个二维整数数组 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排列 &#xff0c;每个 positi…

3. 链表

链表是一种通过指针串联在一起的线性结构,每一个结点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个结点的指针域指向null(空指针的意思)。  1. 链表基础单链表:指针域只指向结点的下一个结点。双链表:每一结点有两个指针域,一个指向下…

记批处理修改计算机名一次蠢操作造成电脑指定的域不存在或无法联系

近日,公司电脑需要修改计算机名(无域控),随意在网上找了一篇修改代码,正常操作右击脚本管理员运行,输入计算机名可正常修改,但是如果运行后不输入计算机名直接点确认,则会造成计算机重启后无法登陆,提示指定的域不存在或无法联系,刚好公司也有这种坑货的存在。虽然不…

java基于ssm 的留学资讯申请网的设计与实现

随着计算机信息化的深入&#xff0c;越来越多的行业使用管理系统来进行管理。出国留学逐渐成为许多大学生的热门选择&#xff0c;但是国外学校多&#xff0c;选择性大&#xff0c;如果从这些信息中&#xff0c;挑选符合自己的学校是非常重要的事情。基于此&#xff0c;开发”萨…

C#基础--集合

文章目录集合集合接口和类型列表创建列表集合初始值设定项添加元素插入元素访问元素删除元素搜索元素排序队列栈链表有序列表字典字典初始化器键的类型Lookup 类有序字典集性能集合 集合接口和类型 大多数集合类都可在System.Collections和System.Collections.Generic名称空间…

河北稳控科技手持VH501TC混合传感器信号采集读数仪工程监测仪器介绍

河北稳控科技手持VH501TC混合传感器信号采集读数仪工程监测VH501TC手持采集读数仪,设备是专用的多类型传感器手持式读数仪,主测传感类型为单弦式振弦传感器,辅测传感类型为电压、电流传感。采用 32 位 ARM 处理器和大尺寸全彩屏、阵列按键设计,彩屏,不受阳光影响,清楚明了…

SpringCloud使用注解+AOP+MQ来实现日志管理模块

简介 无论在什么系统中,日志管理模块都属于十分重要的部分,接下来会通过注解+AOP+MQ的方式实现一个简易的日志管理系统 思路 注解: 标记需要记录日志的方法 AOP: 通过AOP增强代码,利用后置/异常通知的方式获取相关日志信息,最后使用MQ将日志信息发送到专门处理日志的系…

【Python初级人工智能精讲】用Paddlehub给一段没有标点符号的文字加上合适的标点符号

Python初级人工智能精讲 文章目录Python初级人工智能精讲一、写在前面二、七步精讲三、模型介绍四、进入实战1.源代码2.运行效果(1) cmd方面(2) txt文件运行前后对比五、休吃霸王餐六、每日一句一、写在前面 今天给分享的程序是&#xff1a;给一段文字自动加上合适的标点符号&…

【图像重建】基于极限学习机实现图像重建附matlab代码

1 内容介绍 本文采用 ELM 网络求解 ECT 非线性正问题&#xff0c;以提高求解精度&#xff0c;再将其与传统 Landweber 迭代算法相结合&#xff0c;进行图像重建&#xff0c;算法原理框图如图 3 所示&#xff0c;为叙述方便&#xff0c;将该方法记为 ELM-Landweber 算法。 2 部…

卡尔曼滤波(Kalman Filter)设计与应用

估计离散时间或连续时间线性系统的状态。 卡尔曼滤波&#xff08;Kalman filter&#xff09;是一种高效率的递归滤波器&#xff08;自回归滤波器&#xff09;&#xff0c;它能够从一系列的不完全及包含噪声的测量中&#xff0c;估计动态系统的状态。卡尔曼滤波会根据各测量量在…

最新 Hi3861开发环境搭建

Hi3861开发环境 最好参考官方文档&#xff1a; Hi3861开发环境 这里做下记录 &#xff08;1&#xff09;安装编译依赖基础软件&#xff08;仅Ubuntu 20需要&#xff09; 执行以下命令进行安装&#xff1a; sudo apt-get install build-essential gcc g make zlib* libffi-de…

最大子数组和-前缀和/动态规划/分治/暴力-Java/c++

一、题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 二、思路解析 1.前缀和 2.动态规划思想 题目只是要求一个结果&#xff…

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.1 网络的相关概念

非零基础自学Java (老师&#xff1a;韩顺平) ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】 第21章 网络编程 文章目录非零基础自学Java (老师&#xff1a;韩顺平)第21章 网络编程21.1 网络的相关概念21.1.1 网络通信21.1.2 网络21.1.3 ip 地址21.1.4 ipv4 地址分类…

C++ STL新特性:not1 not2 mem_fun mem_fun_ref mem_fn等函数(详解+示例代码)

文章目录谓词not1函数指定类型***继承标准库not2函数指定类型***继承标准库mem_fun函数mem_fun_ref函数mem_fn函数函数绑定示例建议先补充基础知识&#xff0c;否则生啃本节可能会有一定难度&#xff1a; CSTL&#xff1a;仿函数 CSTL&#xff1a; bind函数绑定 谓词 首先来解…

C++类和对象详解(上篇)

文章目录1.1&#xff1a;类的定义方式1.1.1&#xff1a;声明和定义放在类中1.1.2&#xff1a;声明定义分离1.1.3&#xff1a;成员变量命名规则1.1.4&#xff1a;访问限定符1.2&#xff1a;类的作用域1.3&#xff1a;类的实例化1.4&#xff1a;类对象模型1.4.1&#xff1a;如何计…

修改openLDAP管理员密码(docker-compose非容器方式/容器化方式/docker-compose)

文章目录1. 非容器化方式1.1 查看管理员信息1.2 获取密码的加密字串1.3 生成密码修改文件1.4 修改密码1.5 问题2. 容器化方式1. 非容器化方式 非容器化ldap更改管理员密码 1.1 查看管理员信息 命令 ldapsearch -H ldapi:// -LLL -Q -Y EXTERNAL -b "cnconfig" &quo…

Flink 容错机制 Checkpoint 生成与恢复流程

传送门:Flink 系统性学习笔记 Flink 是一个分布式数据处理系统,因此必须有一套机制处理各种故障,例如进程被强制杀掉、机器故障和网络连接中断。任务都是在本地维护状态,所以 Flink 要确保状态不丢以及不错。 在本节中,我们将介绍 Flink 的检查点是如何恢复和生成的,看它…