这次学校数据结构机考,题目很奇怪,简直让我觉得这是算法考试……三道题,撑死了用到树的遍历和并查集,连个队列都没用,也是醉了-.-
第一题 高精度加法
两个数相加,数最多5000位,也就是和最多5001位,而且连数的长度都会给。直接两个数组相加就好。
第二题 给出树的前序、中序遍历,要求写出树的后序遍历。
一棵树,若知道两种遍历,且其中一种是中序遍历,那么必然可以确定下这棵树,自然也可以求出第三种遍历。而这道题中,树最多有26个点(还是52个?记不清了),这就是告诉我们:你们随便搞吧,别进死循环就不会超时~~因此,我们只需要在纸上手动操作一下样例,看看如何构造出这棵树,然后用计算机搞定这个过程,最后后序遍历一下就好了。
第三题 给出两个N×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中是否也位于同一行。至此,后面均同方法一,略。
代码有时间补上。