数据结构(Java):ArrayList的应用

1、引言

上一篇博客,已经为大家讲解了集合类ArrayList。

这篇博客,就来帮助大家学会使用ArrayList。

2、题1: 删除字符(热身题)

题目:给出str1和str2两个字符串,删除str1中出现的所有的str2的字符(不用改变str1本身),使用集合类ArrayList将这些字符存储到顺序表中。

示例:

str1:Welcome to China!

str2:Wow!Grand!

删除后的结果:elcme t Chi

 解题思路:借助String类提供的方法,完成解答。

详细的String类方法在这篇博客:JavaSE:String类常用方法(巨详细)-CSDN博客

解题代码:

public class Test {
    public static void removeData(String str1,String str2,ArrayList<Character> list) {
        int size = str1.length();
        for (int i = 0; i < size; i++) {
            char ch = str1.charAt(i);
            if (!str2.contains(ch+"")) {//注意这里!神来之笔!技巧:字符型+"" 就得到了一个字符串!!!
                list.add(ch);
            }
        }
    }
    public static void main(String[] args) {
        ArrayList<Character> list = new ArrayList<>();
        String str1 = "Welcome to China!";
        String str2 = "Wow!Grand!";
        removeData(str1,str2,list);
        int size = list.size();
        for (int i = 0; i < size; i++) {
            System.out.print(list.get(i));
        }
        System.out.println();//习惯性换行
    }
}

这道题目是非常简单的,我的目的就是让大家记住这个技巧:

字符型+""  就得到了一个字符串!!!

3、题2:杨辉三角

这道题目来自于力扣:杨辉三角-力扣(LeetCode)

                              杨辉三角:

3.1 思路分析

3.1.1 类型分析之 List<List<Integer>>

我们发现方法的返回值类型为:List<List<Integer>>

如果你是第一次遇见这种类型,是不是给懵住了,哈哈,不要慌。

其实这种类型可以理解为一个二维数组

我们知道,对于ArrayList,我们传入的类型参数是什么,那这个顺序表存储的就是什么类型的数据。那么对于List<List<Integer>> 说明顺序表的元素类型为泛型类List<Integer> ,也就是说该顺序表的每个元素又都是一个顺序表。

存储形式如下图:

故,我们可以理解为一个二维数组。

3.1.2 结构分析和存储

而对于杨辉三角,虽然看起来是一个三角形,但如果我们使用代码来实现,只能存储在二维数组中。

而题目的返回值为List<List<Integer>>  ,所以我们可以借助ArrayList构造二维数组,实现数据的存储,实现杨辉三角。

3.1.3 数据分析

根据上面两张图,我们可以发现:

1.第一行只有一个元素1

2. 每一行的第一列和最后一列元素均为1

3. 中间列的元素等于上一行同一列的元素加上上一行前一列的元素之和

也就是说,我们需要对第一行、每一行的第一列最后一列、中间列的元素分别进行处理。

相信大家到这里心中已经有了解题思路,大家可以先自己试着完成,下面我会给出题解。

3.2 解题代码

public List<List<Integer>> generate(int numRows) {
            ArrayList<List<Integer>> list = new ArrayList<>();
            for (int i = 0; i < numRows; i++) {
                list.add(new ArrayList<Integer>());
            }
            //第一行 只有一个元素 特殊处理
            list.get(0).add(1);

            //后面行
            for (int i = 1; i < numRows; i++) {
                //第1列
                list.get(i).add(1);
                //中间数据
                for (int j = 1; j < list.get(i - 1).size(); j++) {
                    //第i行第j列元素 = 第i-1行第j-1列元素 + 第i-1行第j列元素
                    //a[i][j] = a[i-1][j-1] + a[i-1][j]
                    int data1 = list.get(i - 1).get(j - 1);
                    int data2 = list.get(i - 1).get(j);
                    list.get(i).add(data1 + data2);
                }
                //最后一列
                list.get(i).add(1);
            }
            return list;
    }

 4、题3:洗牌算法

题目:有三个人,他们去买了一副扑克牌,将大小王抽出,再将剩下的52张牌进行洗牌,洗完牌后,每个人轮流摸一张牌,共摸牌五轮。(牌有♥、♠、♦、♣之分,牌的大小用数字1~13表示)

问题1:请用代码完成洗牌操作,并展示洗完的牌

问题2:请用代码完成摸牌操作,并展示每人摸到的牌

4.1 思路分析

对于这道题,我们需要明确要构建出哪些对象。

首先,肯定要有牌;再者,要有存放52张牌的顺序表;然后,要有另外三个顺序表,来存放三个人各自所摸到的牌。

所以,步骤如下:

1. 提供牌的类,有花色和数字这两个属性。

2. 构建算法,生成52张牌(注意有花色4种和数字13个),放到顺序表中。

3. 构建算法,进行洗牌操作(打乱存放牌的顺序表)。

4. 构建算法,进行摸牌操作,并存放三个人各自摸到的牌。

ps: 步骤4中, 我们可以利用上文所学到的顺序表构建二维数组的方式存放各自的牌。如下图:

4.2 解题代码

public class Card {
    private String suit;
    private int rank;

    public Card(String suit, int rank) {
        this.suit = suit;//花色
        this.rank = rank;//数字
    }

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

import java.util.ArrayList;
import java.util.Random;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: dings
 * Date: 2024-06-26
 * Time: 16:14
 */
public class Test {
    public static void buyCard(ArrayList<Card> listCard) {
        //买52张牌
        String[] suit = {"♥","♠","♦","♣"};//红桃、黑桃、方片、梅花
        for (int i = 1; i <= 13; i++) {
            for (int j = 0; j < 4; j++) {
                listCard.add(new Card(suit[j],i ));
            }
        }
    }
    public static void shuffleCard(ArrayList<Card> listCard) {
        //洗牌
        int size = listCard.size();//52
        Random ran = new Random();
        for (int i = size - 1; i > 0; i--) {
            int random = ran.nextInt(i);//生成的随机数范围为:[0,i)
            //交换位置
            Card card = listCard.get(i);
            listCard.set(i,listCard.get(random));
            listCard.set(random,card);
        }
    }
    public static void main(String[] args) {
        ArrayList<Card> listCard = new ArrayList<>();
        //生成52张牌
        buyCard(listCard);
        System.out.println("生成的52张有序牌:"+listCard);
        //洗牌
        shuffleCard(listCard);
        System.out.println("打乱后的牌:"+listCard);
        //摸牌(3人轮流摸牌 摸5轮)
        ArrayList<ArrayList<Card>> listPeo = new ArrayList<>();
        listPeo.add(new ArrayList<>());
        listPeo.add(new ArrayList<>());
        listPeo.add(new ArrayList<>());
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card = listCard.remove(0);
                listPeo.get(j).add(card);
            }
        }
        System.out.println("===摸牌===");
        for (int i = 0; i < 3; i++) {
            System.out.println("第"+(i+1)+"个人的牌:"+listPeo.get(i));
        }
        System.out.println("===剩余的牌===");
        System.out.println(listCard);
    }
}

4.3 运行演示

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

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

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

相关文章

【线代基础】张宇30讲+300题错题整理

第一章 行列式 1. 2. 第二章 矩阵 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 第三章 向量 1. 2. 3. 第四章 线性方程组 1. 2. 3. 4. 5. 6. 7. 8. 9. 第五章 特征值与特征向量 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 第六章 二次型 1. 2. 3. 4. 5. 终于结束了线性…

【Mysql】多表关系设计

多表关系设计 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如&#xff1a;一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系&#xff0c;接下来我们一起学习一下多表关系设计方面的知识 一对…

系统性掌握C++17容器四件套:std::optional, std::any, std::variant, std::tuple

昨天在写《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候&#xff0c;正好遇到动态反射需要的类型擦除技术。所谓的类型擦除&#xff0c;就是在两个模块之间的接口层没有任何类型信息&#xff0c;实现两个模块之间安全的通信。可以理…

Unity3D Text使用超链接跳转事件

系列文章目录 Unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、第一种使用TextMeshPro加入超链接&#x1f449;二、继承Text组件,重载OnPopulateMesh方法&#x1f449;三.壁纸分享&#x1f449;总结 &#x1f449;前言 有时候会用到跳转的问题,所以添加一…

Flutter第十五弹 Flutter插件

目标&#xff1a; 1.Flutter插件是什么&#xff1f;有什么作用&#xff1f; 2.怎么创建Flutter插件&#xff1f; 一、什么是插件 在flutter中&#xff0c;一个插件叫做一个package&#xff0c;使用packages的目的就是为了达到模块化&#xff0c;可以创建出可被复用和共享的代…

关于PX4模拟机型的拓展

#多旋翼 #四旋翼&#xff08;默认&#xff09; sudo make px4_sitl gazebo #带光流的四旋翼 sudo make px4_sitl gazebo_iris_opt_flow #3DR Solo&#xff08;四旋翼&#xff09; sudo make px4_sitl gazebo_solo #Typhoon H480&#xff08;六旋翼&#xff09; sudo make px4_s…

超声波清洗机对眼镜有伤害吗?四大顶尖优品公认力作!

超声波清洗机利用超声波在液体中产生的微小气泡爆炸&#xff0c;产生强大的冲击力&#xff0c;能够深入物品的各个角落&#xff0c;有效去除油污、灰尘和细菌。与传统的手工清洗相比&#xff0c;不仅清洁效率高&#xff0c;而且能够保护眼镜不受损伤&#xff0c;特别适合清洗眼…

海纳斯 hinas 的hi3798mv100 华为悦盒 6108v9 安装wifi模块

hi3798mv100安装wifi模块 1.执行脚本 &#xff0c;执行完毕后重启服务器2. 继续执行脚本3.检查网卡驱动安装是否正确4.查看网卡安装状态5.连接wifi结尾 1.执行脚本 &#xff0c;执行完毕后重启服务器 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/install_…

7km远距离WiFi实时图传模块,无人机海上无线传输方案,飞睿智能WiFi MESH自组网技术

在浩瀚无垠的海洋上&#xff0c;无人机正在开启一场前所未有的技术创新。它们不再只是天空的舞者&#xff0c;更是海洋的守望者&#xff0c;为我们带来前所未有的视野和数据。而这一切的背后&#xff0c;都离不开一项创新性的技术——飞睿智能远距离WiFi实时图传模块与无线Mesh…

链式队列算法库构建

学习贺利坚老师课程,构建链式队列算法库 数据结构之自建算法库——链队&#xff08;链式队列&#xff09;_数据结构函数链队列的算法框架有哪些-CSDN博客文章浏览阅读6.2k次&#xff0c;点赞3次&#xff0c;收藏9次。本文针对数据结构基础系列网络课程(3)&#xff1a;栈和队列…

机器学习--概念理解

知识点 一、机器学习概述 人工智能 机器学习 深度学习 学习的范围&#xff1a;模式识别、数据挖掘、统计学习、计算机视觉、语音识别、自然语言处理 可以解决的问题&#xff1a;给定数据的预测问题 二、机器学习的类型 监督学习 分类 回归 无监督学习 聚类 降维 强化…

iOS项目开发遇到问题杂项坑点记录

ios17 弹窗UIAlertController展示逻辑变化&#xff0c;单个词一行展示不下不换行&#xff08;这前版本会换行&#xff09;&#xff0c;直接截断超出部分。 UINavigationController push立刻pop会异常&#xff0c;使用用setViewCollerllers可以避免这个问题 键盘切换后立刻切页…

【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息

问题描述&#xff1a; 在React Native中&#xff0c;我们可以使用measureInWindow的方式去获取一个View在屏幕中的位置信息&#xff1a; 下面这个Demo中&#xff0c;我们写了一个页面HomePage和一个列表项组件ListItemA&#xff0c;我们期望每过5s监测一次列表中每一项在屏幕中…

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

本文将通过一个 24 点小游戏的案例&#xff0c;详细介绍百度智能云千帆 AppBuilder 的基本技术原理和使用方法&#xff0c;帮助读者快速掌握 AI 原生应用的开发流程。 1 三步构建 AI 原生应用方法论 AI 原生应用与传统应用的最大区别是交互形态彻底的拟人化&#xff0c;通过文…

【Linux学习十八】网站管理:防火墙介绍、静态站点、动态站点、域名

1.Apache Apache官网: www.apache.org 软件包名称: httpd 服务端口:80/tcp(http) 443/tcp(https) 配置文件: /etc/httpd/conf/httpd.conf 子配置文件:/etc/httpd/conf.d/*.conf 查看被占用的端口号 netstat -tuln | grep <端口号> 解哪个程序正在使用端口 80&#xff0…

vue封装原生table表格方法

适用场景&#xff1a;有若干个表格&#xff0c;前面几列格式不一致&#xff0c;但是后面几列格式皆为占一个单元格&#xff0c;所以需要封装表格&#xff0c;表格元素自动根据数据结构生成即可&#xff1b;并且用户可新增列数据。 分类&#xff1a; 固定数据部分 就是根据数据…

docker配置redis主从复制

下载redis,复制redis.conf 主节点(6379) 修改redis.conf # bind 127.0.0.1 # 注释掉这里 protected-mode no # 改为no port 6379从节点(6380) 修改redis.conf bind 127.0.0.1 protected-mode no # 改为no port 6380 replicaof 172.17.0.2 6379 # 这里的ip为主节点容器的i…

SpringSecutrity原理

一、基于RBAC实现的权限管理通常需要涉及以下几张表&#xff1a; 1. 用户表&#xff08;user&#xff09;&#xff1a;记录系统中的所有用户&#xff0c;包括用户ID、用户名、密码等信息。 2. 角色表&#xff08;role&#xff09;&#xff1a;记录系统中的所有角色&#xff0…

【项目管理体系】代码评审规范

1完整性检查 2一致性检查 3正确性检查 4可预测性检查 5健壮性检查 6结构性检查 7可追溯性检查 8可理解性检查 9可验证性检查 软件开发全套资料获取&#xff1a;&#xff08;本文末个人名片直接获取&#xff09; 软件产品&#xff0c;特别是行业解决方案软件产品不同于一般的商品…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…