Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

作者头像
E绵绵
发布于 2024-05-03 00:34:57
发布于 2024-05-03 00:34:57
14100
代码可运行
举报
文章被收录于专栏:编程学习之路编程学习之路
运行总次数:0
代码可运行

前言~🥳🎉🎉🎉

Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。 当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步! 加油,一起CHIN UP!💪💪

在这篇文章中,我们将带领大家深入探讨顺序表的实际应用,通过练习相关的习题来巩固知识。本次的焦点是洗牌算法和杨辉三角两个经典问题。现在,就让我们一起揭开它们的神秘面纱,探索其中的奥秘吧!❤️❤️

洗牌算法

❤️❤️内容介绍:我们需要一副完整的扑克牌,除去大小王一共52张牌,参与游戏的玩家共3名,在洗牌后分发每名玩家5张扑克牌。

准备工作

首先我们肯定要有一个类去把我们的一张扑克抽象出来,扑克有花色和点数,那么我们就可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Card {
    private  String suit;//花色
    private  int    rank;//数字

    public String getSuit() {
        return suit;
    }
    public int getRank() {

        return rank;
    }

    public Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

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

❤️❤️那么我们在表示完一张卡后肯定还得表示多张扑克牌(卡组),同时我们还需要一个存放扑克牌的容器,这里我们选用 ArrayList,同时还需要一个数组来存储对应花色。

买一副牌

准备工作都做好了,我们要实现买一副牌,除了大小王一共有52张牌,我们这里用11 12 13 代替 J Q K,每张牌一共有四种花色,也就是定义一个双层循环遍历放入到我们的容器中即可,对于大小王我们这里就不考虑了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public ArrayList<Card> buyCard(){
        for (int i = 1; i <14; i++) {
            for (int j = 0; j <4 ; j++) {
             Card card=new Card( Suits[j],i);
             cardList.add(card);
            }
        }
            return cardList;
    }

洗牌

我们可以运用 Random 类中产生随机数方法,但是产生了随机数,如何打乱牌呢?

我们可以从最后一个开始洗,即 last 位置开始,产生 last 的随机数是 [0~last) ,不包last,所以我们可以从后往前洗牌,每次把最后一张牌与产生的随机数位置的牌交换即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void shuffle( ArrayList<Card> cardList){
        Random random=new Random();
        for (int i = 51; i >0 ; i--) {
            int r=random.nextInt(i);//找0到i的随机数,不包含i
           swap(cardList,i,r);
        }
    }
        void swap(ArrayList<Card> cardList,int i,int r){
            Card temp=cardList.get(i);
               cardList.set(i,cardList.get(r));
               cardList.set(r,temp);
         }
}

发牌

如何去模拟实现发牌呢?一共有三个人打牌,每个人轮流摸牌,一个人5张牌。站在编程的角度,摸到的牌应该放在对应那个人的容器中。

如何表示我们上述的设想呢?假设我们有一个顺序表,一共三个元素,分别代表三个人,而每个元素里面又放着一个顺序表,而这个顺序表对应着这个人摸到的牌!我们就能画出这样的图:

通过图我们想一想,这个结构不就是有一个ArrayList吗?然后ArrayList里面放的元素类型还是ArrayList,我们要传什么实参类型进去呢?当然是Card了啊,因为里面的ArrayList最后是要放扑克牌的。于是我们就能写出这样的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void touchCard(ArrayList<Card> cardList) {
        ArrayList<Card> hand1 = new ArrayList<>();
        ArrayList<Card> hand2 = new ArrayList<>();
        ArrayList<Card> hand3 = new ArrayList<>();
        ArrayList<ArrayList<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++) {
                hand.get(j).add(cardList.remove(0));
            }
        }
        System.out.println("三个人手里的牌");
        System.out.println(hand.get(0));
        System.out.println(hand.get(1));
        System.out.println(hand.get(2));
        System.out.println("卡牌里剩下的牌");
        System.out.println(cardList);
    }

测试整体

❤️❤️下面我们来看下整体代码效果如何:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        CardDemo cardDemo=new CardDemo();
            ArrayList<Card>  cardList= cardDemo.buyCard();
        System.out.println("卡组如下:");
        System.out.println(cardList);
        System.out.println("将其洗牌,洗牌结果如下");
         cardDemo.shuffle(cardList);
        System.out.println(cardList);
        System.out.println(" 有三个人,每个人轮流抓5张牌");
        System.out.println("=============================");
          cardDemo.touchCard(cardList);
    }
}

我们发现该代码没问题,完美实现其作用,所以这就是我们的洗牌算法。

如果想看完整版代码,可以看下我的码云❤️❤️ 洗牌算法 · 814de32 · Eason绵绵/JAVA代码仓库 - Gitee.com

🎯🎯很重要的一点

这里还要注意一个点:对于Card类的重写我们必须写上去,这样才能将ArrayList中的每个Card的内容都显示出来,否则会出现以下结果:

而当我们重写了toString方法将会打印其类的内部内容。所以切记一定要重写该方法,对于Integer等包装类和String类之所以不用重写是因为其内部本身自带toString重写方法。

🎯🎯对于该点我们一定要记下来。之后的学习中将经常见到该知识点的出现。

杨辉三角

❤️❤️对于杨辉三角这个题目我们利用顺序表去做就很简单了。直接给大家呈上代码吧,没有必要讲解,大家看代码应该就能看懂了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main {
    public static void main(String[] args) {
        Solution solution=new Solution();
        System.out.println(solution.generate(8));
    }

}

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list= new ArrayList<>();
        List<Integer> list1=new ArrayList<>();
        list1.add(1);
        list.add(list1);
        for(int i=1;i<numRows;i++){
                List<Integer> list2=new ArrayList<>();
                list2.add(1);
                for(int k=1;k<i;k++){
                    list2.add(list.get(i-1).get(k-1)+list.get(i-1).get(k));
                }
                list2.add(1);
                list.add(list2);
        }
        return list;
    }}

输出结果如下:

所以这就是我们的杨辉三角。(大家看下就好了,这篇文章重点还是洗牌算法)

总结

经过深入研究与实践,我们成功运用顺序表解决了洗牌算法和杨辉三角这两个挑战性问题。对于数据结构领域的各类题目,只有不断地刷题、总结,才能达到真正的熟练与精通。在此,我们诚挚地邀请各位大佬们为我们点赞、关注,并在评论区留下您宝贵的意见与建议。让我们共同学习,共同进步,为知识的海洋增添更多宝贵的财富!🎉🎉🎉❤️❤️💕💕🥳👏👏👏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
简单洗牌算法
我们用一个Card类来定义一个简单的扑克牌模型,包含两个成员变量来表示花色和数字,一个成员方法重写了toString方法 用于返回扑克牌卡片信息,还包含一个构造方法来给两个成员变量赋值:
用户11162265
2024/08/05
1070
简单洗牌算法
ArrayList与顺序表
1.线性表(linear list)是n个 具有相同特性的数据元素的有限序列 。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...
用户11305962
2024/10/09
1020
ArrayList与顺序表
【Java】ArrayList的具体实现:简单的洗牌算法
那么我们是不是可以从后开始往前,将后面的牌与任意一张牌进行交换,这样顺序就被打乱了
喜欢做梦
2024/11/25
970
【Java】ArrayList的具体实现:简单的洗牌算法
基于ArrayList实现的简单的 <洗牌算法>
相信大家都打过扑克牌吧,每当亲朋好友相聚一堂的时候,总少不了这一个娱乐环节,斗地主,跑得快等玩法层出不穷,同时在手机上也出现了不少的扑克牌娱乐的软件;
AUGENSTERN_
2024/04/09
1940
【JAVA数据结构】简单洗牌算法——ArrayList(顺序表)使用实例
详细知识讲解请跳转:【JAVA数据结构】(ArrayList)顺序表-CSDN博客
用户11292525
2024/09/26
1650
【JAVA数据结构】简单洗牌算法——ArrayList(顺序表)使用实例
【发牌游戏】基于顺序表实现
前言: 小编这里将运用顺序表实现模拟发牌的规则,前提是阅读这篇文章的uu具备相应的知识 并且小编在编写代码时,忽略了大小王,以及J,Q,K都是由11,12,13代替的。
用户11288949
2024/09/24
1560
【发牌游戏】基于顺序表实现
《Java初阶数据结构》----2.<线性表---ArrayList与顺序表>
2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
用户11288958
2024/09/24
900
《Java初阶数据结构》----2.<线性表---ArrayList与顺序表>
【java-数据结构篇】神奇 ArrayList,一键打印扑克牌花色与点数
学无止尽5
2025/01/08
810
【java-数据结构篇】神奇 ArrayList,一键打印扑克牌花色与点数
知识改变命运 数据结构【洗牌算法(顺序表)】
a:这个类里面包括一个String类型的数据和int数据类型的数据分别存储花色和牌号 b:创建一个构造方法对牌号和花色赋值· c:进行toString重写
用户11319080
2024/10/17
1270
【Java 基础篇】Java 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。
繁依Fanyi
2023/10/12
7270
【Java 基础篇】Java 实现模拟斗地主游戏
通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
JAVA编程中的对象一般都是通过new进行创建的,新创建的对象通常是初始化的状态,但当这个对象某些属性产生变更,且要求用一个对象副本来保存当前对象的“状态”,这时候就需要用到对象拷贝的功能,以便封装对象之间的快速克隆。
智慧zhuhuix
2020/08/14
3930
通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
转:洗牌算法,随机算法的别名
洗牌算法是随机打乱一组数据的算法。常用的洗牌算法有随机置换算法和Fisher-Yates算法。随机置换算法是在数组中随机交换元素的位置,而Fisher-Yates算法是从数组的末尾向前遍历,并在遍历过程中与随机位置交换元素。
啵啵鳐
2023/07/07
2500
JDK1.9-模拟斗地主洗牌发牌
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/03
7550
Python 中方法调用的求值顺序
问题是,在 Deck 类的 populate() 方法中,self.add(Card(rank, suit)) 的求值顺序是什么?Card(rank, suit) 是先被直接发送到 add 方法,还是先被发送到 Card 类,然后再发送到 add 方法?
用户11021319
2024/04/24
1510
Python 中方法调用的求值顺序
为一副通用纸牌设计数据结构
大家好,我是易安,今天我们来聊一道笔试题,这也是我曾经面试华为时做过的题,今天分享给大家。
架构狂人
2023/06/30
2210
游戏常用算法-洗牌算法
一副扑克54张牌,有54!种排列方式。最佳的洗牌算法,应该能够等概率地生成这54!种结果中的一种
全栈程序员站长
2022/09/06
1.2K0
Collections.shuffle()源码分析
Java.util.Collections类下有一个静态的shuffle()方法,如下:
全栈程序员站长
2022/09/07
2800
用斗地主的实例学会使用java Collections工具类
最近在学习数据结构和算法的过程中频繁用到了Collections工具类,这是开发中的一把利器,简化了许多涉及集合的编码,该文将通过实例对此工具类进入深入剖析。
智慧zhuhuix
2020/08/14
7341
用斗地主的实例学会使用java Collections工具类
自娱自乐之用python写一个21点游戏
如果大家有需要帮忙推荐的工具、框架、应用、脚本可以在文章下方留言,留言中被点赞、推荐回复较多的,波哥就会帮各位提前安排哦!
IT运维技术圈
2025/01/02
1500
自娱自乐之用python写一个21点游戏
第十七天 集合-Collection&amp;增强for&amp;迭代器【悟空教程】
出现意义:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
Java帮帮
2018/07/26
5810
第十七天 集合-Collection&amp;增强for&amp;迭代器【悟空教程】
相关推荐
简单洗牌算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验