ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角

本节课的内容,就让我们来学习一下ArrayList集合的应用,ArrayList的本质就是一个顺序表,那下面一起来学习吧

目录

一、杨辉三角

1.题目详情及链接

2.剖析题目  

3.思路及代码

二、洗牌算法

1.创造牌对象

2.创造一副牌

3.洗牌操作

4.发牌操作


一、杨辉三角

这不是普通的杨辉三角,这是力扣里面的杨辉三角

1.题目详情及链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 

有同学说,这里的题目也看不出跟ArrayList集合有鸡毛关系呀?我说,你别急,继续往下看

看到这里,你急了没有,题目给的类型是什么狗屎?这不就与ArrayList扯上关系了嘛,这到底是什么意思呢?接着往下看

2.剖析题目  

(1)题目的要求是根据参数,生成杨辉三角的前numRows行,并返回存放杨辉三角的空间

比如:numRows=3,就生成杨辉三角的前面3行;如果你用普通的二维数组存储,那就返回该二维数组的地址。

(2)剖析返回值

我们也应该可以猜到,List<List<Integer>>也是表示二维数组的意思

此时还不算完整的二维数组,List只是一个接口,需要实例化对象

(3)我们需要将这些数字放入该二维数组中

3.思路及代码

(1)思路解析

通过面向对象的思想来完成

第一步:分析杨辉三角的规律

题目要求生成杨辉三角的前numRows行,也就是可以一行一行生成

规律是显而易见的,除了第一行,其他每行的第一个元素和最后一个元素的值都是1;从第3行开始,中间的值与前一行的值紧密相连

第二步:创建二维数组并单独完成杨辉三角的第一行

不用担心测试用例一行都没有,1<=numRows<=30

List<List<Integer>> list = new ArrayList<>();
List<Integer> first = new ArrayList<>();
//先设置第一行的元素
first.add(1);
list.add(first);

核心思想:先单独建立一个一维的顺序表,存放好一行的元素,然后再将这个一维的顺序表当成一个元素放入二维的顺序表中,后面也是一样的思想

第三步:存放第二行及后面的元素

for (int i = 1; i < numRows; i++) {//每层循环代表一行List<Integer> ret = new ArrayList<>();//定义一个一维数组    
}

我们将在这个循环里面存放完成后续的行,如果只有一行,就不会进入这个循环内

第四步:分析如何将每一行存入

由前面分析知道,第二行开始,第一个和最后一个元素都是1,我们可以在前面和最后面存入1

    for (int i = 1; i < numRows; i++) {//每层循环代表一行List<Integer> ret = new ArrayList<>();//定义一个一维数组//1.添加第一个元素ret.add(1);//2.设置中间元素,从第二列开始//3.添加最后元素ret.add(1);list.add(ret);//将每一行放入二维数组中}

然后中间的元素如何添加?第二行是没有中间元素的,而且中间的元素都是与前一行的元素有着紧密的关系,所以我们也需要考虑好。首先,我们需要从第二个位置开始存放;然后,第几行就说明那一行有多少个元素,就与行号绑定了关系

        for (int i = 1; i < numRows; i++) {//每层循环代表一行List<Integer> ret = new ArrayList<>();//定义一个一维数组//1.添加第一个元素ret.add(1);//2.设置中间元素,从第二列开始for (int j = 1; j < i; j++) {//利用面向对象的思想,拿到元素int tmp = list.get(i-1).get(j)+list.get(i-1).get(j-1);ret.add(tmp);}//3.添加最后元素ret.add(1);list.add(ret);}

(2)完整代码

 public List<List<Integer>> generate(int numRows) {List<List<Integer>> list = new ArrayList<>();List<Integer> first = new ArrayList<>();//先设置第一行的元素first.add(1);list.add(first);//从第二行开始for (int i = 1; i < numRows; i++) {//每层循环代表一行List<Integer> ret = new ArrayList<>();//定义一个一维数组//1.添加第一个元素ret.add(1);//2.设置中间元素,从第二列开始for (int j = 1; j < i; j++) {int tmp = list.get(i-1).get(j)+list.get(i-1).get(j-1);ret.add(tmp);}//3.添加最后元素ret.add(1);list.add(ret);}return list;
}

(3)总结一下思路

第一:将杨辉三角分成两个部分存储(第一行和第一行后面的

第二:存储第一行后面的时候,又分成三部分存储(第一个元素、中间部分元素、最后一个元素)

第三:存储中间部分元素时,通过与前一行的元素的关系进行存储(利用面向对象的思想获得前一行的元素)

二、洗牌算法

其实,洗牌算法就是ArrayList的一种应用,或者运用,没有那么的高大尚,下面简单介绍洗牌算法的一些基本功能和流程

下面是程序运行起来的结果: 

什么是洗牌算法?

(1)使用类和对象的知识定义一个牌对象

(2)创造出一副排序好的牌,存储在ArrayList中(有牌)

(3)然后将这些牌的顺序打乱(洗牌)

(4)将洗乱的牌随机分发给三个人(发牌)

下面开始讲解洗牌算法

1.创造牌对象

 牌这个对象的属性有两个:第一是花色,第二就是号码;然后我们提供一下构造方法,在创建每一张牌的时候就赋值;最后,重写一下toString方法,用来打印牌。

public class Card {//用来定义一张牌public String suit;//牌的花色public int num;//号码public Card(String suit, int num) {this.suit = suit;this.num = num;}@Overridepublic String toString() {return suit+num;}
}
2.创造一副牌

main函数,用来实例化对象,和调用对象中的方法(创造牌的方法)

public static void main(String[] args) {PlayCard game = new PlayCard();System.out.println("设置牌:");List<Card> cards = game.setCard();System.out.println(cards);}

 创建一个类,用来表示玩牌的游戏,里面存放创建牌、洗牌和发牌的操作

public class PlayCard {public static final String[] suits = {"♠","♥","♣","♦"};//定义花色的数组//1.设置牌操作public List<Card> setCard() {List<Card> cards = new ArrayList<>();//定义一个数组,用来存放所有牌for (int i = 0; i < 4; i++) {//每次循环代表一个花色for (int j = 1; j <=13 ; j++) {//13个号码String suit = suits[i];//获得一个花色Card card = new Card(suit,j);//定义一个牌对象并赋值cards.add(card);//将牌放入一个牌数组中}}return cards;//返回一副牌}
}

(1)这是一个带返回值的函数。

(2)第一层循环,代表花色;第二层循环代码号码;每循环一次:拿到一个花色和号码,然后将这两个赋值给牌对象,并将牌放入ArrayList集合中(cards)

(3)最后将这个集合返回(接收返回值就拿到了返回值)

3.洗牌操作

这里先把上一阶段创造牌的操作隐藏,独将洗牌操作

这里洗牌的思想是:(1)从后面遍历这副牌,每张牌都随机与前面某一张牌交换

(2)获得前面随机牌使用产生随机数种子

(3)交换则单独包装成一个方法

public class PlayCard {//在这里类里面操作牌:设置牌,洗牌和发牌public static final String[] suits = {"♠","♥","♣","♦"};//定义花色的数组//1.设置牌操作//这里介绍洗牌操作,所以设置牌的操作就省略了//2.洗牌操作public void shuffle(List<Card> cards) {Random random = new Random();for (int i = 51; i > 0; i--) {int index  = random.nextInt(i);//随机获取一个牌下标与i下标的牌交换swap(cards,i,index);}//return cards;}private static void swap(List<Card> cards,int i,int j) {//交换两张牌Card tmp = cards.get(i);cards.set(i,cards.get(j));cards.set(j,tmp);}}

4.发牌操作

同样的,我们把前面创造牌和洗牌的操作隐藏起来,单独介绍发牌操作

我们发牌的思路是:(1)有三个人轮流接牌,每次接一张,一共接五轮(2)每个人随机接牌,每拿到一张牌,就从这副牌中删除(3)每个人拿到五张牌,每个人看作一个一维数组;要保存三个人的牌,就需要一个二维数组。

public class PlayCard {//在这里类里面操作牌:设置牌,洗牌和发牌public static final String[] suits = {"♠","♥","♣","♦"};//定义花色的数组//1.设置牌操作//2.洗牌操作//3.发牌操作public List<List<Card>> getCard(List<Card> cards) {//定义三个对象,存取牌List<Card> hand1 =new ArrayList<>();List<Card> hand2 =new ArrayList<>();List<Card> hand3 =new ArrayList<>();//定义一个二维数组,存取三个对象List<List<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++) {Card card = cards.remove(0);//每次拿到第一张牌,并从数组中删掉//放入每个人手中hand.get(j).add(card);}}return hand;}
}

(1)用三个一维的集合代表三个一维数组 (2)再定义一个集合,存放三个一维集合 (3)第一层循环,每循环一次就是一张牌;第二层循环就是每个人轮流拿牌 (4) hand.get(j)代表第几个人,add(card)代表把这张牌给某个人

完整代码:

public static void main(String[] args) {PlayCard game = new PlayCard();System.out.println("设置牌:");List<Card> cards = game.setCard();System.out.println(cards);System.out.println("洗牌后:");game.shuffle(cards);System.out.println(cards);System.out.println("发牌:");List<List<Card>> hand = game.getCard(cards);for (int i = 0; i < 3 ; i++) {System.out.println("第"+(i+1)+"个人的牌为:"+hand.get(i));}System.out.println("剩余的牌为:");System.out.println(cards);}
public class Card {//用来定义一张牌public String suit;//牌的花色public int num;//号码public Card(String suit, int num) {this.suit = suit;this.num = num;}@Overridepublic String toString() {return suit+num;}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;public class PlayCard {//在这里类里面操作牌:设置牌,洗牌和发牌public static final String[] suits = {"♠","♥","♣","♦"};//定义花色的数组//1.设置牌操作public List<Card> setCard() {List<Card> cards = new ArrayList<>();//定义一个数组,用来存放所有牌for (int i = 0; i < 4; i++) {//四种花色for (int j = 1; j <=13 ; j++) {//13个号码String suit = suits[i];//获得一个花色Card card = new Card(suit,j);//定义一个牌对象并赋值cards.add(card);//将牌放入一个牌数组中}}return cards;//返回一副牌}//2.洗牌操作public void shuffle(List<Card> cards) {Random random = new Random();for (int i = 51; i > 0; i--) {int index  = random.nextInt(i);//随机获取一个牌下标与i下标的牌交换swap(cards,i,index);}//return cards;}private static void swap(List<Card> cards,int i,int j) {//交换两张牌Card tmp = cards.get(i);cards.set(i,cards.get(j));cards.set(j,tmp);}//3.发牌操作public List<List<Card>> getCard(List<Card> cards) {//定义三个对象,存取牌List<Card> hand1 =new ArrayList<>();List<Card> hand2 =new ArrayList<>();List<Card> hand3 =new ArrayList<>();//定义一个二维数组,存取三个对象List<List<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++) {Card card = cards.remove(0);//每次拿到第一张牌,并从数组中删掉//放入每个人手中hand.get(j).add(card);}}return hand;}
}

本节的内容就是介绍ArrayList集合的用法,可以当成一维数组,也可以当成二维数组。看到这里本机就结束了,快趁着这个感觉去刷题吧!

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

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

相关文章

人工智能(pytorch)搭建模型22-基于pytorch搭建SimpleBaseline(人体关键点检测)模型,并详细介绍该网络模型与代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型22-基于pytorch搭建SimpleBaseline(人体关键点检测)模型&#xff0c;并详细介绍该网络模型与代码实现。本文将介绍关于SimpleBaseline模型的原理&#xff0c;以及利用pytorch框架搭建模型…

lwIP 细节之三:errf 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

大模型应用_chuanhu川虎

https://github.com/GaiZhenbiao/ChuanhuChatGPT 1 功能 整体功能&#xff0c;想解决什么问题 官网说明&#xff1a;为ChatGPT等多种LLM提供了一个轻快好用的Web图形界面和众多附加功能 当前解决了什么问题&#xff0c;哪些问题解决不了 支持多种大模型&#xff08;也可接入本…

Pytorch学习概述

目录 学习目标人工智能1. 智能&#xff08;Intelligence&#xff09;1.1 人类智能1.2 机器学习&#xff08;人工智能&#xff09;1.3 深度学习1.4 学习系统的发展历程传统的机器学习策略 2. 传统机器学习算法的一些挑战3. 神经网络的简要历史3.1 Back Propagation&#xff08;反…

公司怎么防止办公文件数据\资料外泄?

PC访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 公司可以采取以下措施来防止办公文件数据和资料外泄&#xff1a; 文件加密&#xff1a;对文件进行加密是一种常见的数据安全保护手段。加密后的文件只能在单位内部电脑上…

如何开发嵌入式中断控制系统?

目录 1、中断向量表 2、NVIC&#xff08;内嵌向量中断控制器&#xff09; 3、中断使能 4、中断服务函数 在嵌入式开发过程中&#xff0c;中断处理是一个不可或缺的环节。本篇博文将以STM32微控制器为核心案例&#xff0c;深入解析中断处理在MCU开发中的关键步骤和策略。主要有以…

mysql自动安装脚本(快速部署mysql)

mysql_install - 适用于生产环境单实例快速部署 MySQL8.0 自动安装脚本 mysql8_install.sh&#xff08;执行前修改一下脚本里的配置参数&#xff0c;改成你自己的&#xff09;&#xff08;博客末尾&#xff09; my_test.cnf&#xff08;博客末尾&#xff09;&#xff08;这个…

力扣24 两两交换链表中的节点 Java版本

文章目录 题目解题方法Code 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;hea…

【五】Python 代理模式

文章目录 5.1 代理模式概述5.1.1 代理介绍5.1.2 代理模式的作用 5.2 代理模式的UML类图5.3 了解不同类型的代理5.3.1虚拟代理5.3.2 远程代理5.3.3 保护代理5.3.4 智能代理 5.4 现实世界中的代理模式5.5 代理模式的优点5.6 门面模式和代理模式之间的比较 5.1 代理模式概述 5.1.…

VSCode 配置自动生成头文件

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader VSCode 配置自动生成头文件 一、snippets二、配置步骤三、效果展示 一、snippets 相信大家对C、C都头文件都不陌生&#xff0c;都会发现每个头文件都会包括下面的这些格式&…

Cent OS7 磁盘挂载:扩展存储空间和自动挂载

文章目录 &#xff08;1&#xff09;概述&#xff08;2&#xff09;查看磁盘使用情况&#xff08;3&#xff09;VMware虚拟机挂载磁盘&#xff08;4&#xff09;物理机磁盘挂载&#xff08;5&#xff09;ntfs硬盘处理 &#xff08;1&#xff09;概述 在Linux系统中&#xff0c…

智能优化算法应用:基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.共生生物算法4.实验参数设定5.算法结果6.…

拓展 Amazon S3 技术边界:Amazon S3 Express One Zone 的创新之路

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 自 Amazon S3 服务推出以来&#xff0c;一直是全球各行各业数百万客…

学习MS Dynamics AX 2012编程开发 1. 了解Dynamics AX 2012

在本章中&#xff0c;您将了解开发环境的结构以及Microsoft Dynamics AX中的开发人员可以访问哪些工具。在本书的第一步演练之后&#xff0c;您将很容易理解著名的Hello World代码&#xff0c;您将知道应用程序对象树中的不同节点代表什么。 以下是您将在本章中学习的一些主题…

linux7安装python3.12.1教程

1.下载tar.gz包 地址&#xff1a;Python Release Python 3.12.1 | Python.org 2.上传包到linux服并解压 cd /home/local/ ll tar -zxvf Python-3.12.1.tgz 3.安装编译python所需环境 yum install -y gcc yum install -y zlib* yum -y install zlib-devel bzip2-devel opens…

大象elephant目标检测数据集VOC+YOLO格式2300张

大象是长鼻目象科的哺乳动物&#xff0c;有两个属&#xff0c;是世界上最大的陆生动物。其像柱子一样的四肢和宽厚的脚掌可以稳稳支撑住庞大的身体。巨大的头上长有蒲扇状的大耳朵和长且有弹性的鼻子。象耳上有丰富的血管&#xff0c;可以有效散热。鼻子和上唇合而为一的象鼻由…

计算机网络——网络层——OSPF协议的介绍

什么是 OSPF &#xff1f; OSPF 是一个基于链路状态的自治系统内部路由协议&#xff0c;在 TCP/IP 的网络层中进行路由选择&#xff0c;常用于构建大型企业网络或者服务上的骨干网络。在互联网核心路由器之间也可以使用。 OSPF 概述 OSPF 使用的是 Dijkstra&#xff08;最短…

制作蓝牙小车(一)

制作控制蓝牙小车app 想制作一个蓝牙小车&#xff0c;通过手机app程序操控小车运行&#xff0c;制作分2个部分&#xff08;app制作&#xff0c;蓝牙小车硬件以及程序制作&#xff09;&#xff0c;先完成第一个部分app制作&#xff0c;本次app是通过androidstudio软件来制作安卓…

centos安装了curl却报 -bash: curl: command not found

前因 我服务器上想用curl下载docker-compress&#xff0c;发现没有curl命令&#xff0c;就去下载安装&#xff0c;安装完成之后&#xff0c;报-bash: curl: command not found 解决方法 [rootcentos ~]# rpm -e --nodeps curl warning: file /usr/bin/curl: remove failed: …

python每日学10:关于python实用版本的选择

用python也有好几年了&#xff0c;也会经常安装python&#xff0c;因为有工作需要&#xff0c;可能在各个地方使用python&#xff0c;自己的电脑也经常重装&#xff0c;重装后会装python&#xff0c;还有的时候&#xff0c;装的包太多了&#xff0c;影响整个环境的使用&#xf…