探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

目录

目录

  前言~🥳🎉🎉🎉  

洗牌算法 

准备工作 

 买一副牌

洗牌

 发牌

测试整体 

🎯🎯很重要的一点

杨辉三角 

总结 


  前言~🥳🎉🎉🎉  

Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。

如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。

当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步!

加油,一起CHIN UP!💪💪

🔗个人主页:E绵绵的博客
📚所属专栏:

1. JAVA知识点专栏

        深入探索JAVA的核心概念与技术细节

2.JAVA题目练习

        实战演练,巩固JAVA编程技能

3.c语言知识点专栏

        揭示c语言的底层逻辑与高级特性

4.c语言题目练习

        挑战自我,提升c语言编程能力

📘 持续更新中,敬请期待❤️❤️

在这篇文章中,我们将带领大家深入探讨顺序表的实际应用,通过练习相关的习题来巩固知识。本次的焦点是洗牌算法和杨辉三角两个经典问题。现在,就让我们一起揭开它们的神秘面纱,探索其中的奥秘吧!❤️❤️

洗牌算法 

❤️❤️内容介绍:我们需要一副完整的扑克牌,除去大小王一共52张牌,参与游戏的玩家共3名,在洗牌后分发每名玩家5张扑克牌。

准备工作 

首先我们肯定要有一个类去把我们的一张扑克抽象出来,扑克有花色和点数,那么我们就可以这样写:

public class Card {
    private  String suit;//花色
    private  int    rank;//数字

    public String getSuit() {
        return suit;
    }
    public int getRank() {

        return rank;
    }

    public Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "["+suit+","+rank+"]";
    }
}

 ❤️❤️那么我们在表示完一张卡后肯定还得表示多张扑克牌(卡组),同时我们还需要一个存放扑克牌的容器,这里我们选用 ArrayList,同时还需要一个数组来存储对应花色。  

 买一副牌

准备工作都做好了,我们要实现买一副牌,除了大小王一共有52张牌,我们这里用11 12 13 代替 J Q K,每张牌一共有四种花色,也就是定义一个双层循环遍历放入到我们的容器中即可,对于大小王我们这里就不考虑了。

    public ArrayList<Card> buyCard(){
        for (int i = 1; i <14; i++) {
            for (int j = 0; j <4 ; j++) {
             Card card=new Card( Suits[j],i);
             cardList.add(card);
            }
        }
            return cardList;
    }

洗牌

我们可以运用 Random 类中产生随机数方法,但是产生了随机数,如何打乱牌呢?

我们可以从最后一个开始洗,即 last 位置开始,产生 last 的随机数是 [0~last) ,不包last,所以我们可以从后往前洗牌,每次把最后一张牌与产生的随机数位置的牌交换即可。

 public void shuffle( ArrayList<Card> cardList){
        Random random=new Random();
        for (int i = 51; i >0 ; i--) {
            int r=random.nextInt(i);//找0到i的随机数,不包含i
           swap(cardList,i,r);
        }
    }
        void swap(ArrayList<Card> cardList,int i,int r){
            Card temp=cardList.get(i);
               cardList.set(i,cardList.get(r));
               cardList.set(r,temp);
         }
}

 发牌

如何去模拟实现发牌呢?一共有三个人打牌,每个人轮流摸牌,一个人5张牌。站在编程的角度,摸到的牌应该放在对应那个人的容器中。 

如何表示我们上述的设想呢?假设我们有一个顺序表,一共三个元素,分别代表三个人,而每个元素里面又放着一个顺序表,而这个顺序表对应着这个人摸到的牌!我们就能画出这样的图:  

通过图我们想一想,这个结构不就是有一个ArrayList吗?然后ArrayList里面放的元素类型还是ArrayList,我们要传什么实参类型进去呢?当然是Card了啊,因为里面的ArrayList最后是要放扑克牌的。于是我们就能写出这样的代码:

public void touchCard(ArrayList<Card> cardList) {
        ArrayList<Card> hand1 = new ArrayList<>();
        ArrayList<Card> hand2 = new ArrayList<>();
        ArrayList<Card> hand3 = new ArrayList<>();
        ArrayList<ArrayList<Card>> hand = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                hand.get(j).add(cardList.remove(0));
            }
        }
        System.out.println("三个人手里的牌");
        System.out.println(hand.get(0));
        System.out.println(hand.get(1));
        System.out.println(hand.get(2));
        System.out.println("卡牌里剩下的牌");
        System.out.println(cardList);
    }

测试整体 

       ❤️❤️下面我们来看下整体代码效果如何:

public class Test {
    public static void main(String[] args) {
        CardDemo cardDemo=new CardDemo();
            ArrayList<Card>  cardList= cardDemo.buyCard();
        System.out.println("卡组如下:");
        System.out.println(cardList);
        System.out.println("将其洗牌,洗牌结果如下");
         cardDemo.shuffle(cardList);
        System.out.println(cardList);
        System.out.println(" 有三个人,每个人轮流抓5张牌");
        System.out.println("=============================");
          cardDemo.touchCard(cardList);
    }
}


我们发现该代码没问题,完美实现其作用,所以这就是我们的洗牌算法。

如果想看完整版代码,可以看下我的码云❤️❤️

洗牌算法 · 814de32 · Eason绵绵/JAVA代码仓库 - Gitee.com

🎯🎯很重要的一点

这里还要注意一个点:对于Card类的重写我们必须写上去,这样才能将ArrayList中的每个Card的内容都显示出来,否则会出现以下结果:


   
 

而当我们重写了toString方法将会打印其类的内部内容。所以切记一定要重写该方法,对于Integer等包装类和String类之所以不用重写是因为其内部本身自带toString重写方法。

  


🎯🎯对于该点我们一定要记下来。之后的学习中将经常见到该知识点的出现。

杨辉三角 

❤️❤️对于杨辉三角这个题目我们利用顺序表去做就很简单了。直接给大家呈上代码吧,没有必要讲解,大家看代码应该就能看懂了。

public class Main {
    public static void main(String[] args) {
        Solution solution=new Solution();
        System.out.println(solution.generate(8));
    }

}

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list= new ArrayList<>();
        List<Integer> list1=new ArrayList<>();
        list1.add(1);
        list.add(list1);
        for(int i=1;i<numRows;i++){
                List<Integer> list2=new ArrayList<>();
                list2.add(1);
                for(int k=1;k<i;k++){
                    list2.add(list.get(i-1).get(k-1)+list.get(i-1).get(k));
                }
                list2.add(1);
                list.add(list2);
        }
        return list;
    }}

输出结果如下:


所以这就是我们的杨辉三角。(大家看下就好了,这篇文章重点还是洗牌算法)

总结 

经过深入研究与实践,我们成功运用顺序表解决了洗牌算法和杨辉三角这两个挑战性问题。对于数据结构领域的各类题目,只有不断地刷题、总结,才能达到真正的熟练与精通。在此,我们诚挚地邀请各位大佬们为我们点赞、关注,并在评论区留下您宝贵的意见与建议。让我们共同学习,共同进步,为知识的海洋增添更多宝贵的财富!🎉🎉🎉❤️❤️💕💕🥳👏👏👏

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

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

相关文章

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

PaLmTac嵌入软体手手掌的视触觉传感器

触觉是感知和操作之间的桥梁。触觉信息对于手部行为反馈和规划具有重要意义。软体手的柔性特性在人机交互、生物医学设备和假肢等方面具有潜在应用的优势。本文提出了一种名为 PaLmTac的嵌入软体手手掌的视触觉传感器&#xff08;vision-based tactile sensor, VBTS&#xff09…

使用 BurpSuite 基于 Token 机制实施暴力破解

前言 Token是一种用于身份验证和授权的令牌&#xff0c;通常由服务器生成并发送给客户端&#xff0c;客户端在后续的请求中携带该令牌来进行身份验证和授权操作。Token的使用可以增强应用程序的安全性&#xff0c;避免了直接传递敏感凭证&#xff08;如用户名和密码&#xff0…

Gradle 进阶学习之 Gradle插件

1、使用插件的原因 使用插件是现代自动化构建工具中一个非常重要的概念&#xff0c;Gradle 作为其中一个流行工具&#xff0c;通过插件提供了多种便利。以下是使用插件的几个主要原因&#xff1a; 促进代码重用 减少重复代码&#xff1a;插件允许你重用在不同项目中执行相同功…

Linux中gcc/g++的使用

文章目录 前言gcc/g 前言 gcc和g即为编译器。其中gcc为c语言的编译器&#xff0c;只能编译c语言&#xff1b;g为c的编译器&#xff0c;既能编译c语言&#xff0c;又能编译c。 在前面的文章中&#xff0c;我们提到代码转换成可执行程序需要经过 预处理&#xff08;进行宏替换)…

ID决策树的构造原理

前言 &#x1f3f7;️&#x1f3f7;️本章开始学习有关决策树的相关知识&#xff0c;决策树是一种树形模型&#xff0c;也是一种常用的分类和回归方法。本章我们首先介绍第一种决策树的构造原理 学习目标 了解决策树算法的基本思想掌握 ID3 决策树的构建原理 1.决策树介绍 …

Spring Cloud Kubernetes 实践 服务注册发现、服务动态配置

一、Spring Cloud Kubernetes 随着云计算和微服务架构的不断发展&#xff0c;k8s 和Spring Cloud成为了当今技术领域的两大热门话题。k8s作为一个开源的容器编排平台&#xff0c;已经在自动化部署、扩展和管理方面取得了巨大的成功&#xff0c;而Spring Cloud则以其丰富的生态…

区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测(Matlab)

区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09; 目录 区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基…

傲软录屏(ApowerREC)一款简单好用的录屏软件,中文破姐版 v1.6.9.6(240501)

软件介绍 傲软录屏&#xff0c;是由ApowerREC开发的一款高级录屏软件&#xff0c;兼容多个操作系统平台&#xff0c;包括Windows、Mac以及基于安卓和iOS的设备。这款专业工具具备捕捉各类屏幕活动的能力&#xff0c;确保音视频同步&#xff0c;无论用户是进行电脑桌面操作、参…

C++string类使用大全

目录 温馨提示&#xff1a;这篇文章有约两万字 什么是string类&#xff1f; 一. 定义和初始化string对象 1.string的构造函数的形式&#xff1a; 2.拷贝赋值运算符 3.assign函数 二.string对象上的操作 1.读写string对象 2.读取未知数量的string对象 3.使用getline …

软件工程毕业设计选题100例

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…

Mac brew安装Redis之后更新配置文件的方法

安装命令 brew install redis 查看安装位置命令 brew list redis #查看redis安装的位置 % brew list redis /usr/local/Cellar/redis/6.2.5/.bottle/etc/ (2 files) /usr/local/Cellar/redis/6.2.5/bin/redis-benchmark /usr/local/Cellar/redis/6.2.5/bin/redis-check-ao…

高级商务谈判口才培训教程(3篇)

高级商务谈判口才培训教程&#xff08;3篇&#xff09; 高级商务谈判口才培训教程&#xff08;**篇&#xff09;&#xff1a;基础篇 一、前言 在高级商务谈判中&#xff0c;口才不仅是交流的工具&#xff0c;更是策略执行的关键。本教程将从基础出发&#xff0c;带领大家逐步掌…

【PHP】安装指定版本Composer

1、下载指定版本composer.phar文件&#xff1a;https://github.com/composer/composer/releases 2、将下载的文件添加到全局路径&#xff1a; sudo mv composer.phar /usr/local/bin/composer 3、赋予权限&#xff1a; sudo chmod x /usr/local/bin/composer 4、查看compos…

52.HarmonyOS鸿蒙系统 App(ArkTS)配置文件添加多个权限方法

52.HarmonyOS鸿蒙系统 App(ArkTS)配置文件添加多个权限方法 module.json5

前端开发者如何在项目里控制修改组件的样式

1为了让自己快速下班&#xff0c;修改样式应该是占据大部分时间&#xff0c;在很多组件库的项目里&#xff0c;都会提到主题设置。 比如element的scss配置变量&#xff0c;通常有人喜欢直接引入css样式来快速完成任务&#xff0c;然后在全局覆盖这些选择器对应的样式&#xff0…

OpenCV(二)—— 车牌定位

从本篇文章开始我们进入 OpenCV 的 Demo 实战。首先&#xff0c;我们会用接下来的三篇文章介绍车牌识别 Demo。 1、概述 识别图片中的车牌号码需要经过三步&#xff1a; 车牌定位&#xff1a;从整张图片中识别出牌照&#xff0c;主要操作包括对原图进行预处理、把车牌从整图…

信号知识详解

目录 1、信号的产生 2、core 核心转储 3、信号的保存 4、信号的处理 信号是linux系统提供的&#xff0c;让用户或进程给其他进程发送异步信息的一种方式。 常见的信号处理方式&#xff1a; 1、默认行为 2、忽略 3、自定义 1、信号的产生 1、kill命令 我们可以使用命令 k…

过渡与动画

单元素/组件过渡 Vue在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的过渡效果&#xff08;一个淡入淡出的效果&#xff09; 在条件渲染&#xff08;使用v-if&#xff09;、条件展示&#xff08;使用v-show&#xff09;、动态组件、组件根节点等情形中&#xff0c;可…

【火猫DOTA2】电竞世界杯DOTA2项目将在7月份的前三周举办

1、电竞世界杯将于今年7月3日至8月25日在沙特利雅得举办。近日主办方公布了各个项目的举办时间,其中DOTA2项目将在7月份的前三周举办。转载:火猫TV资讯https://www.huomaotv.com/ 目前Falcons、XG、GG和Liquid这五支赢得了足够EPT积分的队伍已经确定直邀沙特。剩下的三个名额还…
最新文章