数据结构与算法--判断扑克牌是否顺子

扑克牌的顺子

  • 题目:从扑克牌中随机抽取N张牌,判断是否顺子,即这N张牌是不是连续的。扑克牌中2 ~ 10 为数字,11代表j,12代表k,13代表K,并且大小王可以代表任意数字。

抽象概念

  • 将扑克牌抽象成计算机语言,数字自然好处理,n张牌用 n 个元素的数组标识,大小王特殊数字,我们用0 标识。

  • 分析:

    • 用数组标识,那么问题变为判断数组是否连续,最直观就是排序了
    • 此处有特殊因素0,也就是即使不连续,但是差值 小于 0 的个数还是看成连续
    • 有对子必然不是顺子,除了0 以外
    • 案例{2,3,4,0,6,8,0},两个0 分别代表
    • 那么需做三件事,排序,统计0 个数,检查是否连续,判断对子
      • 排序:因为是固定的范围,此处最合适的排序算法是桶排序,在之前的排序总结中有所有排序动图,此处不再详细讲解,时间复杂度O(n),空间复杂度O(1)
      • 统计0 个数,因为在检查是否连续时候,已经是排序的状态,那么先遇到的必然是0(如果0 存在)可以顺带统计,时间复杂度O(n)
      • 遍历检查,时间复杂度O(n)
  • 经如上分析有如下代码

/*** 扑克牌中随机抽 5 张牌, 判断是否是顺子,注意大小王可以替任何数字* @author liaojiamin* @Date:Created in 15:07 2021/7/6*/
public class ValidateContinuous {public static void main(String[] args) {int[] array = new int[60];int position = 0;for (int i = 0; i <= 13; i++) {if(i==0){for (int i1 = 53; i1 < 60; i1++) {array[i1] = 0;position+=1;}}else {for (int i1 = 0; i1 < 4; i1++) {array[position]=i;position++;}}}System.out.println(isContinuous(array, 5));}/*** 用数组标识抽取出来的扑克,0-标识大小王,11-j,12-Q,13K* 先排序,在判断各个数据直接的间隔差距,差距大于0的数量则不连续* 有0以外的对子,不连续* */public static boolean isContinuous(int[] pukeArray, int number){int[] array = new int[number];Random random = new Random();for (int i = 0; i < array.length; i++) {int card = pukeArray[random.nextInt(pukeArray.length -1)];System.out.println(card);array[i] = card;}int[] bucketArray = bucketSort(array);int position = 0;for (int i = 0; i < bucketArray.length; i++) {if(i != 0 && bucketArray[i] >= 2){return false;}for (int i1 = 0; i1 < bucketArray[i]; i1++) {array[position] = i;position++;}}Integer countZero = 0;for (int i = 0; i < array.length; i++) {if(array[i] == 0){countZero ++;}if(i > 0 && array[i-1] != 0){if(array[i] - array[i-1] > countZero){return false;}}}return true;}/*** 桶排序:此处返回通,不返回排序后的数组,用来判断是否有除了0 以外的对子* */public static int[] bucketSort(int[] array){if(array == null || array.length<=0){return array;}int[] bucketArray = new int[14];for (int i : array) {bucketArray[i]+=1;}return bucketArray;}
}
  • 如上我们在桶排序时候做了一点小优化,直接返回的桶而不是排序后的数据,在归纳桶中数据时候顺便判断是否存在对子
  • 以上随机选取n 张牌时候并不规范,因为没将已经选取的牌踢出 扑克牌总数组,此处我们只为说明之后的算法流程,不考虑这个
  • 算法时间复杂度O(n),空间复杂度O(1)

上一篇:数据结构与算法–翻转单词顺序
下一篇:数据结构与算法–我们来玩丢手绢(约瑟夫环问题)

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

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

相关文章

.NET Core下的开源分布式任务调度系统ScheduleMaster-v2.0低调发布

从1月份首次公开介绍这个项目到现在也快4个月了&#xff0c;期间做了一些修修补补整体没什么大的改动。2.0算是发布之后第一个大的版本更新&#xff0c;带来了许多新功能新特性&#xff0c;也修复了一些已知的bug&#xff0c;在此感谢在博客、Issue和QQ群中提出各种意见的朋友&…

[Java基础]自然排序Comparable的使用

代码如下: package ComparablePack;public class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}public String getName() {return name;}pu…

数据结构与算法--我们来玩丢手绢(约瑟夫环问题)

我们来玩丢手绢 昨天我们打扑克&#xff0c;今天我们丢手绢丢手绢我们都知道这个游戏&#xff0c;他的由来由约瑟夫 &#xff08;Josephus&#xff09;提出来的 据说著名犹太历史学家Josephus有过以下的故事&#xff1a;在罗马人占领乔塔帕特后&#xff0c;39 个犹太人与Jose…

后端开发都应该了解点接口的压力测试(Apache Bench版)

背景 小A&#xff1a;小B&#xff0c;最近调你的接口老是超时呀&#xff0c;8秒都还没返回结果&#xff0c;是不是有性能问题呀&#xff01;小B &#xff1a;我看看~~类似这样的对话&#xff0c;在现实中是时有发生的&#xff0c;不是特别严重的话&#xff0c;往往大家也不会去…

数据结构与算法--这个需求很简单怎么实现我不管(发散思维)

发散思维 程序员是一个高危职业&#xff0c;最近动不动就听到谁谁谁猝死&#xff0c;谁谁谁过劳晕倒&#xff0c;所以面对奇葩问题&#xff0c;我们要淡定&#xff0c; 开发中被产品虐&#xff0c;说的最多的一句话就是这个需求很简单&#xff0c;怎么实现我不管 找工作被面试…

[Java基础]比较器排序Comparator的使用

代码如下: package ComparablePack;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this…

手把手教你如何构建 WPF 官方开源框架源代码

本文转自林德熙的博客&#xff08;blog.lindexi.com&#xff09;导语从去年微软就将 WPF 开源了&#xff0c;差不多现在所有 WPF 的源代码都开源了。在学习框架的时候&#xff0c;我会做一些改动&#xff0c;期望能构建一个自己的版本进行测试。但是作为一个特别大的框架&#…

数据结构与算法--再来聊聊数组

再来聊聊数组 这篇我们来总结一下数组相关的一些算法&#xff0c;数组的特点在于我们能通过下标得到对应数据&#xff0c;时间复杂度在O(1)&#xff0c;之前有多篇文章有数组相关的体系&#xff0c;一下来一个归纳&#xff1a; 数据结构与算法–判断扑克牌是否顺子 数据结构…

[Java基础]泛型基础

可变参数的使用&#xff1a; 代码如下: package CanChangePack;import java.util.Arrays; import java.util.List;public class ArgsDemo01 {public static void main(String[] args){List<String> list Arrays.asList("hello","world","jav…

深入理解kestrel的应用

1 前言之所以写本文章&#xff0c;是因为在我停止维护多年前写的NetworkSocket组件两年多来&#xff0c;还是有一些开发者在关注这个项目&#xff0c;我希望有类似需求的开发者明白为什么要停止更新&#xff0c;可以使用什么更好的方式来替换(其实很大原因是我把时间花在开发We…

数据结构与算法--二叉树第k个大的节点

二叉树第k个大的节点 二叉树文章列表&#xff1a; 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆&#xff08;最大堆&#xff0c;最小堆&#xff09;实现及原理 数据结构与算法–二叉查找树转顺序排列双向链表 数据…

Istio 中的 Sidecar 注入及透明流量劫持过程详解

图片来源&#xff1a;上海五角场 by Jimmy Song本文基于 Istio 1.5.1 版本&#xff0c;将为大家介绍以下内容&#xff1a;什么是 sidecar 模式和它的优势在哪里。Istio 中是如何做 sidecar 注入的&#xff1f;Sidecar proxy 是如何做透明流量劫持的&#xff1f;流量是如何路由到…

数据结构与算法--求1~n能组成的所有二叉搜索树的排列

给定一个整数n&#xff0c;生成并返回所有N个节点组成并且节点值从1到n互不相同的不同二叉树&#xff0c;可以按照任意顺序 二叉树文章列表&#xff1a; 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆&#xff08;最大…

Java语法基础50题训练(下)

题目1: HashMap集合存储学生对象并遍历。 需求: 创建一个HashMap集合&#xff0c;键是学生对象(Student)&#xff0c;值是居住地(String)。存储多个键值对象&#xff0c;并遍历。 要求: 保证键的唯一性&#xff1a;如果学生对象的成员变量值相同&#xff0c;我们就认为是同一…

用long类型让我出了次生产事故,写代码还是要小心点

昨天发现线上试跑期的一个程序挂了&#xff0c;平时都跑的好好的&#xff0c;查了下日志是因为昨天运营跑了一家美妆top级淘品牌店&#xff0c;会员量近千万&#xff0c;一下子就把128G的内存给爆了&#xff0c;当时并行跑了二个任务&#xff0c;没辙先速写一段代码限流&#x…

Mongodb查询分析器解析

Mongodb查询分析器 动态相关项目中涉及到数据量大和吞吐量的接口&#xff0c;例如关注页面动态&#xff0c;附近动态&#xff0c;这部分数据都是存储在mongodb中&#xff0c;在线上数据中分类两个mongodb集合存储其中关注动态基于扩散写的设计&#xff0c;数据量已经快到 8 亿…

[Java基础]Collections概述和使用

代码如下: package CollectionDemo01;import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List;public class CollectionDemo01 {public static void main(String[] args){List<Integer> list new ArrayList&l…

链路追踪在ERP系统中的应用实践

源宝导读&#xff1a;随着ERP的部署架构越来越复杂&#xff0c;对运维监控、问题排查等工作增加了难度&#xff0c;本文将介绍通过引入链路追踪技术&#xff0c;提高ERP系统问题排查效率&#xff0c;支撑更全面监控系统运行情况的实践过程。一、导读随着ERP的部署架构越来越复杂…

[Java基础]File基础

File类概述和构造方法: 代码如下: package FileStudyPack;import java.io.File;public class FileDemo01 {public static void main(String[] args){File f1 new File("D:\\JavaDemo\\java.txt");System.out.println(f1);File f2 new File("D:\\JavaDemo&quo…