数据结构之ArrayList与顺序表(下)
找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏:数据结构(Java版)
目录
ArrayList的具体使用
118. 杨辉三角
扑克洗牌算法
接上篇:数据结构之ArrayList与顺序表(上)-CSDN博客
ArrayList的具体使用
118. 杨辉三角
给定一个非负整数
numRows
,生成「杨辉三角」的前numRows
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:
输入: numRows = 1 输出: [[1]]
1 <= numRows <= 30
分析:首先是一个杨辉三角的问题,杨辉三角其实就是一个只有一半的二维数组。
public class Test {public static void main(String[] args) {// 打印杨辉三角Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int count = 0;// 创建一个n行n列的二维数组int[][] array = new int[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j) {array[i][j] = 1;}else if (j == 0) {array[i][j] = 1;}else {// 只有从第二行开始才会有下面的规律if (i >= 2) {array[i][j] = array[i-1][j] + array[i-1][j-1];}}}}for (int[] x:array) {for (int y:x) {if (y != 0) {System.out.print(y+" ");}}System.out.println();}}
}
打印结果:
注意:杨辉三角还有一个规律就是第 i-1 行有 i 个元素。
这里主要的难点是:List<List<Integer>> 这个代码的意思是什么?分开看,List<Integer> 这个代码的意思是有一个线性表,这个线性表中存放的是 Integer 类型。List<List<Integer>> 难道这个代码的意思是有一个线性表,这个线性表里面存放的是一个线性表?没错!不过这个不叫线性表了。如果我们把这个List看成一个数组,那就是一个数组里面存放的是一个一个的数组元素,然后这些数组元素里面的元素是一个一个的整形包装类。这就是二维数组嘛!二维数组里面是一个一个的一维数组,而一维数组里面是一个一个的整型元素。
例如:
public class Test {public static void main(String[] args) {// 二维数组// 根据顺序表的特点这个二维数组为0行0列List<List<Integer>> list = new ArrayList<>(); //二维数组的初始化list.add(new ArrayList<>()); // 二维数组的元素是一维数组list.add(new ArrayList<>()); // 二维数组的元素是一维数组list.add(new ArrayList<>()); // 二维数组的元素是一维数组// 一维数组的初始化list.get(0).add(10); // list.get(0)得到的是下标为0的一维数组,接着尾插10list.get(1).add(20); // list.get(1)得到的是下标为1的一维数组,接着尾插20list.get(2).add(30); // list.get(2)得到的是下标为2的一维数组,接着尾插30}
}
画图理解:
上面搞懂了,就可以开始做题了。这个题目的意思就是让我们把存放杨辉三角二维数组改成一个ArrayList。
根据我们用二维数组做题时的代码改编一下就可以了。
下面是改编的代码:
方法一:
public class Test {public static List<List<Integer>> generate(int numRows) {// 创建一个二维数组List<List<Integer>> list = new ArrayList<List<Integer>>();for (int i = 0; i < numRows; i++) {// 不用下标直接尾插也是可以的list.add(i, new ArrayList<>());}// 开始为二维数组存放元素for (int i = 0; i < numRows; i++) {List<Integer> list1 = list.get(i);// 注意这里j的条件for (int j = 0; j <= i; j++) {if (i == j) {list1.add(1);}else if (j == 0) {list1.add(1);}else if (i >= 2) {// 实现这个代码:a[i][j] = a[i-1][j]+a[i-1][j-1];// 得到i-1下标数组的j位置的值 得到i-1下标数组的j-1位置的值// 这个写法有问题。就像:3 = 5// list.get(i).get(j) = list.get(i-1).get(j) + list.get(i-1).get(j-1);// 这个就是对上面的代码进行翻译一下int t = list.get(i - 1).get(j) + list.get(i - 1).get(j - 1);list1.add(j , t);}}}return list;}public static void main(String[] args) {List<List<Integer>> listList = generate(5);for (List<Integer> list : listList) {for (Integer x : list) {System.out.print(x+" ");}System.out.println();}}
}
方法二:
public class TestDrive {public static List<List<Integer>> generate(int numRows) {// 创建一个二维数组List<List<Integer>> list = new ArrayList<List<Integer>>();for (int i = 0; i < numRows; i++) {// 不用下标直接尾插也是可以的list.add(i, new ArrayList<>());// 为二维数组的每一位元素的初始化为0for (int j = 0; j < numRows; j++) {list.get(i).add(j,0);}}// 开始为二维数组存放元素for (int i = 0; i < numRows; i++) {List<Integer> list1 = list.get(i);// 注意这里的j和方法进行区别for (int j = 0; j < numRows; j++) {if (i == j) {// 因为所有元素都有初始值了,所以这里就都是set而不是addlist1.set(j,1);}else if (j == 0) {list1.set(j,1);}else if (i >= 2) {int t = list.get(i - 1).get(j) + list.get(i - 1).get(j - 1);list1.set(j , t);}}}return list;}public static void main(String[] args) {List<List<Integer>> listList = generate(5);for (List<Integer> list : listList) {for (Integer x : list) {if (x != 0) {System.out.print(x+" ");}}System.out.println();}}
}
方法一与方法二的区别:
方法二就是完全对前面代码的改编。因为前面我们在创建一个二维数组的同时是进行了初始化的,所以这里的所有元素都是有初始值的。但我们用顺序表来创建二维数组的时候,如果没有初始化,那么其值就是null,这个是不能参与运算的。因此,我们要手动的置为0,这样就可以参与运算了,否则就会发生异常。
方法一就是改进了方法二的不足之处。既然你不初始化,在运算时,会发生异常,那么我就把你的范围卡在只参与运算的部分。也就是 j <= i 。我们仔细观察会发现杨辉三角是一个等腰直角三角形。如下图:
杨辉三角练习完了,接下来,就要进入重磅戏了:扑克洗牌算法。
扑克洗牌算法
要求:
1. 生成一副扑克牌。
2. 并且把这副扑克牌打乱。
3. 发给3个人,每人每轮发一张,总共发5轮。
一张一张的牌,一张牌包括牌面值和花色
// 一张牌
public class Card {public int rank; // 牌面值public String suit; // 对应的花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic String toString() {return ""+suit+rank+" ";}
}
有了一张一张的牌,就可以生成一副牌和存放牌的容器,也就是顺序表
public class Cards {// 生成牌的四色public static final String suit[] = {"♠","♣","♥","♦"};public List<Card> cardList;// 在new一个对象的时候,就会生成存储一副牌的数组public Cards() {this.cardList = new ArrayList<>();}// 生成一副牌// 为了方便,这里的牌面值都用数字表示public List<Card> generateCards() {for (int i = 1; i <= 14; i++) {int count = 0;for (int j = 0; j < suit.length; j++) {// 生成一张牌Card card = new Card(i, suit[j]);// 把牌存放到数组中cardList.add(card);if (i > 13 && count < 2) {count++;}if (count == 2) {break;}}}return cardList;}
}
接下来就是要开始洗牌了。
// 洗牌public void shuffle() {// 通过随机下标进行交换Random random = new Random();// i=0就是自己和自己交换了for (int i = cardList.size()-1; i > 0; i--) {// 生成[0,i)之间的值,也就是[0,i-1]int index = random.nextInt(i);swap(cardList, index, i);}}private void swap(List<Card> cardList, int index, int i) {// 交换index和i下标对应的数组元素// int tmp = a; a = b; b = tmp;Card tmp = cardList.get(i);// 把i下标的值,改为index下标对应的值cardList.set(i, cardList.get(index));cardList.set(index, tmp);}
发牌
// 发牌// 给3人发5轮牌,每人每轮发一张public List<List<Card>> dealCards() {// 创建一个二维数组List<List<Card>> listList = new ArrayList<>();for (int i = 0; i < 3; i++) {listList.add(new ArrayList<>());}for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {// 第j个人拿到第0下标的牌listList.get(j).add(cardList.get(0)); // 假设从最上面开始拿// 每拿一张就少一张cardList.remove(0);}}return listList;}
测试:
public class Test {public static void main(String[] args) {// 生成一副牌Cards cards = new Cards();List<Card> cardList = cards.generateCards();System.out.println(cardList);// 开始洗牌——将牌的顺序打乱cards.shuffle();System.out.println(cardList);// 开始发牌List<List<Card>> listList = cards.dealCards();// 查看结果int i = 1;for (List<Card> list: listList) {System.out.print("第"+i+"个人拿到的牌:");for (Card x : list) {System.out.print(x+" ");}i++;System.out.println();}}
}
好啦!本期 数据结构之ArrayList与顺序表(下)的学习就到此结束啦!我们下一期再一起学习吧!
相关文章:
数据结构之ArrayList与顺序表(下)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 ArrayList的具体使用 118. 杨辉三角 扑克洗牌算法 接上篇:数据结构之ArrayLis…...
openi启智社区 aarch64 npu环境安装飞桨paddlepaddle和PaddleNLP(失败)
以前在启智社区都是编译安装飞桨,这回看到飞桨提供了npu安装包,兴冲冲的以为安装很简单。 之所以安装飞桨,是因为想在启智社区的启智大脑调试环境使用最新的PaddleNLP,结果报错:No module named paddle.nn.layer.laye…...
【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞
0x01 产品简介 多客圈子论坛系统是一种面向特定人群或特定话题的社交网络,它提供了用户之间交流、分享、讨论的平台。在这个系统中,用户可以创建、加入不同的圈子,圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、…...
46-1 护网溯源 - 钓鱼邮件溯源
一、客户提供钓鱼邮件样本 二、行为分析 三、样本分析 对钓鱼邮件中的木马程序1111.exe文件进行了分析,提交了360安全大脑沙箱云和微步在线云沙箱。 360安全大脑沙箱云显示,该1111.exe文件存在危险,因此在解压时需要谨慎操作,以免触发木马程序。 建议使用360压缩软件进行…...
鸿蒙低代码开发一个高频问题
在版本是DevEco Studio 3.1.1 Release,SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况,或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的: JSON schema validation error: data/visualModel/value/…...
关于使用南墙waf防护halo网站主页请求404报错的解决方案
文章目录 环境说明问题展示原因探究解决方法 环境说明 在1panel应用商店,部署南墙waf(docker版)halo(2.16.1社区版)注意部署过程中注意uuwaf必须勾选允许外部访问,halo可以不勾选[这里为了证明确实是南墙waf的原因,选择勾选] 问题展示 使…...
Elasticsearch 认证模拟题 - 13
一、题目 集群中有索引 task3,用 oa、OA、Oa、oA 查询结构是 4 条,使用 dingding 的查询结果是 1 条。通过 reindex 索引 task3 为 task3_new,能够使 task3_new 满足以下查询条件。 使用 oa、OA、Oa、oA、0A、dingding 查询都能够返回 6 条…...
Day25 首页待办事项及备忘录添加功能
本章节,完成首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 在 AddMemoViewModel逻辑处理类中,为了支持与其关联的View视图文件的数据绑定,需要定义一个与视图文件相匹配的实体类 Model。这个Model将包含 View中…...
SpringBoot——全局异常处理
目录 异常 项目总结 新建一个SpringBoot项目 pom.xml Result(通用的响应结果类) MyBusinessException自定义异常类 GlobalExceptionHandler全局异常处理类 ExceptionController控制器 SpringbootExceptionApplication启动类 参考文章:…...
SpringBoot+Vue教师工作量管理系统(前后端分离)
技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 教师管理员 功能截图...
华为OD技术面试-最长回文串-2024手撕代码真题
题目:最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最…...
Python实现连连看8
4 游戏开始 连连看游戏实际上主要完成的是对玩家鼠标点击事件的处理,也就是对鼠标点击事件的响应。 4.1 添加鼠标点击事件响应 在“1.3.4 在窗口上铺设画布”中提到的将画布pack()到窗口代码之前,写入如下代码,其功能是为鼠标点击事件添加响应。 canvas.bind(<Button…...
[Cloud Networking] Layer Protocol (continue)
文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路:通过阻断冗余…...
人工智能在交通与物流领域的普及及应用
文章目录 🐋引言 🐋自动驾驶 🦈自动驾驶汽车 🐡应用现状 🐡技术实现 🐡实现过程及代码 🐋智能交通管理 🦈应用现状 🦈技术实现 🦈实现过程及代码 &…...
JVM学习-详解类加载器(二)
双亲委派机制 双亲委派优势 避免类的重复加载,确保一个类的全局唯一性 Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层次关系可以避免类的重复加载,当父类已经加载了该类,就没有必要子ClassLoader再加载…...
数字校园的优势有哪些
数字化时代下,数字校园已成为教育领域一股显著趋势。数字校园旨在借助信息技术工具对传统校园进行改造,提供全新的教学、管理和服务方式。那么,数字校园究竟具备何种优势?现从三个方面为您详细介绍。 首先,数字校园为教…...
DexCap——斯坦福李飞飞团队泡茶机器人:更好数据收集系统的原理解析、源码剖析
前言 2023年7月,我司组建大模型项目开发团队,从最开始的论文审稿,演变成目前的两大赋能方向 大模型应用方面,以微调和RAG为代表 除了论文审稿微调之外,目前我司内部正在逐一开发论文翻译、论文对话、论文idea提炼、论…...
【Mtk Camera开发学习】01 MTK 平台Camera BringUp
本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 这篇文章主要介绍MTK 平台,Camera BringUp会涉及到修改的模块。 MTK不同的平台系列,具体修改…...
新能源汽车内卷真相
导语:2025年,我国新能源汽车总产能预计可达3661万辆,如此产能如何消化? 文 | 胡安 “这样卷下去不是办法,企业目的是什么?是盈利,为国家作贡献,为社会作贡献。我们应该有大格局&…...
C 语言实现在终端里输出二维码
Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…...
nodejs---fs模块,文件读写操作详解,自定义一个文件写入方法
fs模块导入 Node.js 同时支持 CommonJS 和 ES 模块系统(自 Node.js v12 以来) // 两种模块导入方式 import * as fs from fs;// Es6:这种方式需要在package.json中配置"type": "module" const fs require(fs);// commonJs:如果你…...
Linux(Rocky)下 如何输入中文(切换中文输入法)教程
RockyLinux如何输入中文(切换中文输入法) 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…...
Python中包(package)与模块(module)的概念 以及 import 问题
目录 Python中 包(package) 与 模块(module) 的概念一. Python中, 包 (package) 与 模块 (module) 的概念1. 一个有 __init__.py 文件 的目录, 被视为一个 Python 的 包 (package)2. 一个Python源文件 , 被视为一个模块 (module) 二. 不同包之间 以及 同一个包的不同模块之间的…...
Android常见内存泄漏场景总结
一、非静态内部类造成的内存泄漏 造成原因:非静态内部类默认会持有外部类的引用,如果内部类的生命周期超过了外部类就会造成内存泄漏。 场景:当Activity销毁后,由于内部类中存在异步耗时任务还在执行,导致Activity实…...
未来已来:Angular、React、Vue.js——前端框架的三大巨头
目录 前言 一、Angular框架 特点和优势 核心技术和应用场景 二、React框架 特点和优势 核心技术和应用场景 三、Vue.js框架 特点和优势 核心技术和应用场景 总结: 前言 在Web前端开发领域,随着技术的不断发展,出现了众多优秀的框…...
Mybatis06-动态SQL
动态SQL 1.什么是动态SQL 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 类似JSTL标签 官网描述: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接…...
26-LINUX--I/O复用-select
一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符,对提高程序的性能有很大帮助。以下情况适用于I/O复用技术: ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…...
spring源码解析-(2)Bean的包扫描
包扫描的过程 测试代码: // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…...
Java 数学计算 - Random类
在Java中,Random类用于生成伪随机数。这个类在java.util包中,你可以使用它来生成整数、浮点数等不同类型的随机数。以下是关于Random类的一些学习笔记和示例。 1. 创建Random对象 首先,你需要创建一个Random对象。默认情况下,如…...
Ubuntu22.04之解决:无法关机和重启问题(二百四十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
优化企业网站/百度一下打开
w10设置文件服务器 内容精选换一换华为云弹性文件服务(Scalable File Service)为用户的弹性云服务器(ECS)提供一个完全托管的共享文件存储,符合标准文件协议(NFS)来自:产品cd /home/ior-master/src/home/OpenMPI/bin/mpirun --allow-run-as-root -machin…...
简单网站搭建/搜索引擎优化心得体会
Python的三大神器:装饰器.迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧! 生成器 仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。 创建一个生成器函数 >>> def …...
用js做的个人酷炫网站/百度招聘
js算法一、关于排序1.1冒泡排序1.2 快速排序二、反向输出2.1 数组反向输出2.2 字符串反向输出三、数学方法3.1 阶乘的实现3.2 生成斐波那契数列四、回文串五、变量值互换六、计算出现次数6.1 计算字符串里出现最多的字符及次数6.2 计算数组里出现最多的元素及次数一、关于排序 …...
wordpress最新begin主题下载/会员制营销方案
文章目录商品列表页逻辑代码商品列表页的数据渲染商品详细页Ajax实现商品收藏商品列表页逻辑代码 commodity的views.py定义视图函数commodityView from django.core.paginator import Paginator, PageNotAnInteger,EmptyPage from django.http import HttpResponse from djan…...
python做网站原理/网站有吗免费的
前言 在JVM专栏的第一篇:我们讲了什么是双亲委派模型,以及为什么需要双亲委派模型。还没看过的大佬,有钱没钱都捧个人场,点它: 你能说出jvm的类加载是什么吗 同时还了解到这样设计是为了保持JVM整个体系的稳定。但在…...
做网站要注意哪一点/域名权重查询工具
卫星通信自20世纪60年代出现以来,在全球通信领域扮演着重要的角色。而随着因特网旋风的出现,卫星通信与因特网相结合的卫星因特网技术成为卫星通信发展中的新热点。 卫星因特网技术近期得到了快速发展,卫星已成为因特网连接的一个重要组成部…...