大二《数据结构》机考解题报告

       这次学校数据结构机考,题目很奇怪,简直让我觉得这是算法考试……三道题,撑死了用到树的遍历和并查集,连个队列都没用,也是醉了-.-

第一题 高精度加法

   两个数相加,数最多5000位,也就是和最多5001位,而且连数的长度都会给。直接两个数组相加就好。

第二题 给出树的前序、中序遍历,要求写出树的后序遍历。

   一棵树,若知道两种遍历,且其中一种是中序遍历,那么必然可以确定下这棵树,自然也可以求出第三种遍历。而这道题中,树最多有26个点(还是52个?记不清了),这就是告诉我们:你们随便搞吧,别进死循环就不会超时~~因此,我们只需要在纸上手动操作一下样例,看看如何构造出这棵树,然后用计算机搞定这个过程,最后后序遍历一下就好了。

第三题 给出两个M的矩阵,问只通过交换两行和交换两列,是否可以从其中一个矩阵构造出另一个。

       分析一下这两种操作,以交换两行为例:操作过程中,原来是一行的那些元素,换完了还是在一行;原来是一列的那些元素,现在还是在一列。而且,还可以想到,一旦满足这个条件,那么这两个矩阵一定可以互相构造出来,证明略。(因为这个很明显是对的,但是我暂时只能想到很麻烦的证明方法,所以就先不写了,等我想到很简洁漂亮的方法,会在此更新的。)因此,我们只要去判断这个就好了:A矩阵中随便取一行元素,在B矩阵中找相同的元素,应当也是在同一行;列同上。我暂时想到的有两种方法——

       方法一:并查集。在此只说行如何做,列的类似就好了。我们首先初始化并查集,然后扫一遍A矩阵,一行一行扫,把每行的所有数都合并到同一个集合。这样搞完,两个数如果在同一个集合中,则说明他们在A中处于同一行。此时,我们再扫一遍B矩阵,也是一行一行扫,每一行的数据判断下是否都在同一个集合中(判断方法随意,保证线性即可,当然此题数据太小,此处平方级别也可以过),这样如果全都合法,就说明B中在同一行的数据,在A中也处于同一行。如此这般,行列都做完,都合法,也就可以输出Yes了,否则中间直接跳出输出No便可。应当注意的是,题目本身保证了一个矩阵中没有相同的数,在此条件之下,上面判断过程如果都满足,则说明两矩阵中的元素完全一样,这个无需单独判断。

       方法二:存映射。如果你不想用并查集,比如你想提高效率(毕竟并查集的复杂度不是O(1)而是O(α)嘛-.-),或者觉得并查集代码太麻烦(毕竟有四五行-.-),那么你可以考虑详细一些。其实,我们只需要做到下面这样就足够了:对于A矩阵中的任意一个数,都可以瞬间找到其在B矩阵中的位置。这种思路下,我们只要扫一遍B,存一个下标0~10000的数组siteB(元素的范围是0~10000),数组中的元素是坐标(i,j),其意义为:siteB[x]表示x在B中的位置。而后,我们扫一遍A矩阵,一行一行扫,利用siteB数组,判断每行元素在B中是否也位于同一行。至此,后面均同方法一,略。

    代码有时间补上。

posted on   IceDream61  阅读(678)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示