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

发布于:2024-06-28 ⋅ 阅读:(145) ⋅ 点赞:(0)

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~本次博客到这里就结束了,

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

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

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