数据结构之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的一维数组,接着尾插10
        list.get(1).add(20); // list.get(1)得到的是下标为1的一维数组,接着尾插20
        list.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<>());
            // 为二维数组的每一位元素的初始化为0
            for (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而不是add
                    list1.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;
    }

    @Override
    public 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与顺序表(下)的学习就到此结束啦!我们下一期再一起学习吧!

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

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

相关文章

mqtt-emqx:简单安装emqx

安装依赖 yum install -y epel-release libatomic下载 cd /chz/install/emqx wget https://www.emqx.com/en/downloads/broker/5.7.0/emqx-5.7.0-el7-amd64.tar.gz解压 mkdir -p emqx && tar -zxvf emqx-5.7.0-el7-amd64.tar.gz -C emqx后台运行 cd /chz/install/e…

ChatGPT-4o体验demo

OpenAI 最近推出了其最新的人工智能语言模型——GPT-4O。该模型是在原有 GPT-4 的基础上进行优化而成&#xff0c;旨在提升生成质量和响应速度。GPT-4O 采用了更加高效的架构设计&#xff0c;使其在处理复杂文本时表现出更快的速度和更高的准确性。GPT-4O 在训练过程中融入了最…

【每日刷题】Day59

【每日刷题】Day59 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1103. 分糖果 II - 力扣&#xff08;LeetCode&#xff09; 2. 1051. 高度检查器 - 力扣&#xff08…

C语言详解(动态内存管理)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

CTF Show MISC做题笔记

MISCX 30 题目压缩包为misc2.rar,其中包含三个文件:misc1.zip, flag.txt, hint.txt。其中后两个文件是加密的。 先解压出misc1.zip, 发现其中包含两个文件&#xff1a;misc.png和music.doc。其中后面文件是加密的。 解压出misc.png,发现图片尾部有消息&#xff1a;flag{flag…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

使用CodeGen进行程序综合推理

Program Synthesis with CodeGen — ROCm Blogs (amd.com) CodeGen是基于标准Transformer的自回归语言模型家族&#xff0c;用于程序合成&#xff0c;正如作者所定义的&#xff0c;它是一种利用输入-输出示例或自然语言描述生成解决指定问题的计算机程序的方法。 我们将测试的…

哈希桶封装unordered_map、unordered_set

哈希桶源代码 我们将由下列的哈希桶来模拟封装STL库中的unordered_map和unordered_set 注意&#xff1a;为了实现封装unordered_map和unordered_set&#xff0c;我们需要对下列源码进行优化。 //哈希桶 namespace hashbucket {template<class K,class V>struct HashNo…

双列集合基础知识

package exercise;import java.util.HashMap; import java.util.Map;public class Demo1 {public static void main(String[] args) {Map<String, String> map new HashMap<>();//在添加数据的时候&#xff0c;如果键不存在&#xff0c;那么直接把键值对对象添加到…

Linux下线程的互斥与同步详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

go语言实战--基于Vue3+gin框架的实战Cetide网项目(讲解开发过程中的各种踩坑)

最近被要求学习go语言开发&#xff0c;也就做一个项目实战巩固一下&#xff0c;也分享一下关于gin框架的实战项目 &#xff08;后续应该还是会继续学习Java&#xff0c;这一期还是做一个govue的&#xff09; 经过一段时间的开发过后&#xff0c;感觉现在的开发效率要快不少了&…

你可以直接和数据库对话了!DB-GPT 用LLM定义数据库下一代交互方式,数据库领域的GPT、开启数据3.0 时代

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 你可以直接和数据库对话了&#xff01;DB-GPT 用LLM定义数据库下一代交互方式&#xff0c;数据库领…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第6章——级数

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 6. 级数(Series) 本章从等比级数(geometric series)开始&#xff0c;研究可以使用公式计算无限和的条件。它讨论了部分和与级数收敛的符号、图形表示和定义&#xff0c;并将它们应用于调和级数。它介绍了级…

EKF在LiFePO4电池SOC估算中不好用?一问带你破解EKF应用难题

磷酸铁锂电池因为平台区的存在&#xff0c;导致使用戴维南模型EKF的方法时&#xff0c;无法准确进行SOC准确预估。所以最近搜索了大量关于磷酸铁锂电池SOC预估的论文、期刊&#xff0c;但我被海量忽略客观事实、仅为了毕业的硕士论文给震惊到了。很多论文为了掩饰平台区的存在&…

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中&#xff0c;品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式&#xff0c;不仅影响着消费者的购买决策&#xff0c;更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

python文件:py,ipynb, pyi, pyc, pyd, pyo都是什么文件?

1、Python文件类型介绍 &#x1f4c1; 1.1 .py 文件&#xff1a;源代码基础 .py 文件是 Python 最基本的源代码文件格式&#xff0c;用于存储纯文本形式的 Python 代码。它是开发者编写程序的主要场所&#xff0c;包含函数、类、变量定义以及执行逻辑。Python 解释器直接读取…

C++ OpenCV 图像分类魔法:探索神奇的模型与代码

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

React hooks动态配置侧边栏

React hooks根据不同需求 还有不同的角色 动态的去配置侧边栏 需求&#xff1a; 点击某个按钮是一套侧边栏 &#xff0c;不同角色&#xff08;比如管理员之类的权限高一点&#xff09;比普通用户多个侧边栏 然后点击另一个按钮是另一套侧边栏 此时&#xff0c;就需要动态的去…

解决微信小程序分享按钮不可用

问题描述 在微信小程序中点击胶囊按钮上的三个点&#xff0c;在弹出的对话框中的【分享给好友】【分享到朋友圈】按钮都属于不可用的状态&#xff0c;显示未设置。 问题截图 解决方案 在每个需要此功能的页面都需要添加此代码&#xff0c;否则就不能进行使用。 // vue3时&l…

基础乐理入门

基础概念 乐音&#xff1a;音高&#xff08;频率&#xff09;固定&#xff0c;振动规则的音。钢琴等乐器发出的是乐音&#xff0c;听起来悦耳、柔和。噪音&#xff1a;振动不规则&#xff0c;音高也不明显的音。风声、雨声、机器轰鸣声是噪音&#xff0c;大多数打击乐器&#…