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

news/2024/11/20 19:43:57/

目录

目录

  前言~🥳🎉🎉🎉  

洗牌算法 

准备工作 

 买一副牌

洗牌

 发牌

测试整体 

🎯🎯很重要的一点

杨辉三角 

总结 


  前言~🥳🎉🎉🎉  

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;}@Overridepublic 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的随机数,不包含iswap(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.ppmy.cn/news/1443593.html

相关文章

Linux下的基本指令(1)

嗨喽大家好呀&#xff01;今天阿鑫给大家带来Linux下的基本指令&#xff08;1&#xff09;&#xff0c;下面让我们一起进入Linux的学习吧&#xff01; Linux下的基本指令 ls 指令pwd命令cd 指令touch指令mkdir指令(重要)rmdir指令 && rm 指令(重要)man指令(重要)cp指…

接收区块链的CCF会议--IPCCC 2024 截止7.1 附录用率

会议名称&#xff1a;IPCCC CCF等级&#xff1a;CCF C类会议 类别&#xff1a;计算机网络 录用率&#xff1a;2023年长文录用率26%&#xff08;33/127&#xff09;&#xff0c;另录了22篇短文和海报论文 Topics of interest include, but are not limited to: Cloud Computi…

Docker Error log

1.1) for blank palces, only used space instead of table keys docker run \--name mysql \-e MYSQL_ROOT_PASSWORD123 \-p 3306:3306 \-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \-v /tmp/mysql/data:/var/lib/mysql \-d \mysql

API提取IP

API代理作为IP代理的一项重要业务&#xff0c;在绕开地域网络限制&#xff0c;提高作业效率等方面提供强大的技术支持。它能够帮助用户快速实现软件与软件间的交流&#xff0c;无障碍连通不同应用程序逻辑开发的系统应用。API代理用途范围广泛&#xff0c;如使用API提取代理IP、…

偏测试技术面试,高频面试题分享

一.介绍下你们公司产品的后端模块? 以电商微服务架构示例&#xff1a; 用户服务 (User Service)&#xff1a; 负责用户注册、登录、个人信息管理等功能。存储用户数据&#xff0c;如用户名、密码、个人资料等。商品服务 (Product Service)&#xff1a; 管理商品信息&#xf…

JAVA与人工智能:开发未来的AI

java人工智能的发展 随着人工智能技术的不断发展&#xff0c;越来越多的开发者开始关注Java在人工智能领域中的应用。作为一门广泛应用于企业级应用开发的编程语言&#xff0c;Java在人工智能领域也有着广泛的应用。本文将从Java基础知识回顾开始介绍Java与人工智能的关系&…

【实战教程】结合自定义损失函数采用LoRA微调Llama3-8B

文章目录 准备工作LoRA微调效果评估分类微调模型评估生成式微调模型评估 准备工作 准备特定场景微调数据1000左右的量级作为训练集&#xff0c;300左右的数据作为测试集&#xff08;最好是英文版&#xff09;&#xff0c;数据集的格式示例如下&#xff1a; // 判别式分类任务…

Electron中使用Prisma(以SQLite为例)

1、安装 Prisma 打开终端&#xff0c;执行以下命令安装 Prisma CLI&#xff1a; npm install prisma -g 2、初始化 Prisma 项目 在工作目录中执行以下命令来初始化一个新的 Prisma 项目&#xff1a; prisma init 这将创建一个新的文件夹&#xff0c;包含了必要的文件和目…