首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyQt5数据库开发2 5.1 QSqlQueryModel
目录 一、Qt窗体设计 1. 新建Qt项目 2. 拷贝4-3的部分组件过来 3. 添加资源文件  4. 创建Action 5. 添加工具栏 6. 创建菜单项  7. 关闭Action的实现 8. 调整布局 8.1 调整两个groupbox的布局 8.3 为窗体设置全局布局 二、代码拷贝和删除 1. 新建项目目录 2. 编译窗体文件和资源文件 3. Eric6项目 4. 拷贝文件 5. 删代码 6. 现有代码 7. 运行文件 三、代码修改 1. 添加import模块 2. tableView显示 3. 测试t
会洗碗的CV工程师
2023/02/26
5920
PyQt5数据库开发2 5.1 QSqlQueryModel
_PyQt5数据库开发2 5.1 QSqlQueryModel
调整后,两个groupBox和centralwidget之间出现了一层splitter
会洗碗的CV工程师
2023/11/28
2110
_PyQt5数据库开发2 5.1 QSqlQueryModel
PyQt5数据库开发2 5.2 QSqlRelationalTableModel
注意学生表有个外键指向部门表的departid,还有个外键指向专业表的majorid
会洗碗的CV工程师
2023/02/26
3990
PyQt5数据库开发2 5.2 QSqlRelationalTableModel
PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】
目录 一、Qt主窗体设计 1. 新建Qt项目 2. 添加一个tableview  3. 添加资源  4. 添加Action  5. 修改Action的状态 6. 添加工具栏 7. 添加菜单  8. 实现按钮功能  二、Qt对话框窗体设计 1. 新建窗体 2. 拷贝组件 3. 放按钮 4. 调整布局 5. 为按钮设置图标  6. 实现按钮功能  三、窗体功能实现 1. 编译窗体文件和资源文件 2. 新建项目  3. 新建appMain.py文件  4. 新建myMainWindow.py文件  5. 新建my
会洗碗的CV工程师
2023/03/11
1.3K0
PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】
PyQt5数据库开发1 4.3 QSqlTableModel①
修改工具栏的toolButtonStyle属性,改为ToolButtonTextUnderIcon
会洗碗的CV工程师
2023/11/30
1960
PyQt5数据库开发1 4.3 QSqlTableModel①
PyQt5数据库开发2 5.2 QSqlRelationalTableModel②
注意除了actOpenDB和actQuit之外,其他Action的enabled属性取消
会洗碗的CV工程师
2023/11/30
1850
PyQt5数据库开发2 5.2 QSqlRelationalTableModel②
PyQt5数据库开发1 4.3 QSqlTableModel②
frame由三个部分组成,一个排序GroupBox,一个数据过滤GroupBox,还有一个水平Spacer
会洗碗的CV工程师
2023/11/30
2300
PyQt5数据库开发1 4.3 QSqlTableModel②
PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)
目录 一、打开数据库表 1. 写打开数据库的槽函数 2. 运行后发现数据库可以打开了 3. ODBC配通了,数据库还是打不开 4. 写在tableView上显示数据库表的函数 5. 运行后发现表可以显示了 6. 代码分析 7. 添加列名称 8. 根据内容调整列宽 9. 备注:数据库连接串 二、建立tableview与右侧组件的关联 1. 当前无关联 2. 添加关联代码 3. 运行程序 4. 添加选择行变化的信号与槽函数  5. 运行程序  6. 发现tableView可以选择多行 7. 添加代码,限制tab
会洗碗的CV工程师
2023/02/26
2.1K0
PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)
PyQt5数据库开发3 6 QSqlQuery完整实操案例①
除了actOpenDB和actQuit之外,把其他的action全部改为不是enabled的,其他的可以根据自己需要来进行添加
会洗碗的CV工程师
2023/11/30
2280
PyQt5数据库开发3 6 QSqlQuery完整实操案例①
PyQt5数据库开发1 4.3 QSqlTableModel④上部
参见4 PyQt5数据库开发 4.1 SQL Server 2008 R2如何开启数据库的远程连接
会洗碗的CV工程师
2023/11/30
2640
PyQt5数据库开发1 4.3 QSqlTableModel④上部
PyQt5编程扩展 3.2 资源文件的使用
项目路径:e:\baikejia\bkj3-2,项目名QtApp,基类选择QWidget
会洗碗的CV工程师
2023/02/26
8640
PyQt5编程扩展 3.2 资源文件的使用
PyQt5可视化 7 饼图和柱状图实操案例 ②建表建项目改布局
目录 一、数据库建表 1 建表 2 插入数据 3 查看表数据 二、建立项目 1 新建项目 2 appMain.py 3 myMainWindow.py 4 myChartView.py 2.4.1 提升的后果 2.4.2 QmyChartView类说明 2.4.3 添加代码 三、修改myMainWindow.py程序,添加功能 1 打开数据库 2 生成分数数据 3.2.1 import新模块 3.2.2 在构造函数中设置数据模型,调用生成分数函数  3.2.3 生成分数函数  3.2.4 运行看看 3 统计
会洗碗的CV工程师
2023/03/11
7610
PyQt5可视化 7 饼图和柱状图实操案例 ②建表建项目改布局
【QT】:QMainWindow 窗口
Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面。
IsLand1314
2025/02/18
6130
【QT】:QMainWindow 窗口
PyQt5数据库开发1 4.3 QSqlTableModel④下部
发现右边groupbox出现第一条数据。无论左边tableview点哪个单元格,右边的groupbox都不跟着变化
会洗碗的CV工程师
2023/11/30
2510
PyQt5数据库开发1 4.3 QSqlTableModel④下部
PyQt5编程基础 2.2 信号与槽函数
三个CheckBox的ObjectName分别设为chkBoxUnder、chkBoxItalic、chkBoxBold,text分别设为Underline、Italic、Bold,其中chkBoxUnder的checked属性打勾
会洗碗的CV工程师
2023/02/10
2K0
PyQt5编程基础 2.2 信号与槽函数
PyQt5数据库开发3 6 QSqlQuery完整实操案例③
会洗碗的CV工程师
2023/11/30
2220
PyQt5数据库开发3 6 QSqlQuery完整实操案例③
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
在 PyQt5 中,菜单栏(QMenuBar)、工具栏(QToolBar)和状态栏(QStatusBar)是 QMainWindow 提供的标准控件,用于帮助用户更好地与应用程序交互。它们是桌面应用程序的常见组成部分:
半截诗
2024/10/09
3.9K0
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
使用Qt Designer 设计主窗口
选中Type Here 处 双击(或按 Enter键)编辑菜单名。输入完毕后按Enter 键 确认,可继续编辑下一个菜单项。如有必要,可以在菜单项之间添加分隔符。可拖动以修改菜单项的顺序。
用户6021899
2019/08/14
5.1K0
PyQt5可视化 7 饼图和柱状图实操案例 ①Qt项目的创建
目录 一、新建Qt项目 二、添加组件和布局 三、添加资源 1. 新建资源文件 2. 添加图标资源  四、frameHead 1. toolBtnGenData 2. toolBtnCounting 3. comboTheme 4. comboAnimation 5. Horizontal Spacer 6. toolBtnQuit 7. 设置toolBtnQuit的功能  8. frameHead的属性  9. 布局 10. frameHead的层次  五、frameData 1. groupBoxGrad
会洗碗的CV工程师
2023/03/08
1.1K0
PyQt5可视化 7 饼图和柱状图实操案例 ①Qt项目的创建
13.QT-QMainWindow组件使用
QMainWindow介绍 主窗口是与用户进行长时间交互的顶层窗口,比如记事本 主窗口通常是应用程序启动后显示的第一个窗口 QMainWindow是Qt中主窗口的基类,继承于QWidget,如下图所
诺谦
2018/05/28
2.4K0
相关推荐
PyQt5数据库开发2 5.1 QSqlQueryModel
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验