It has been 519 days since the last update, the content of the article may be outdated.
📢
本系列文章只提供课上测试的解读
所有课下作业的源代码请按下面指示前往我的Github仓库~
通过阅读本文,您可以大致了解 2023 年秋季北航计算机组成原理课程 P2 课上测试的题目内容、难度和解题思路
P2 课上测试 3题做出2题 通过。主要内容是对 MIPS汇编语言 的使用综合考察
题目每年都会发生变化,题意描述大致清晰,但是可能与原题有一定差异
T0·合并两个有序数组
题目描述
给你两个按非递减顺序排列的整数数组nums1
和 nums2
,请你将两个数组合并为 nums
,并使合并后的 nums
同样按非递减顺序排列。
边界条件
- 数组中可能包含重复元素,两个数组中的重复元素需要全部保留;同时,对于边界条件,数组中可能存在负数,请注意自己的实现方式。
- 输入的数组长度大于
0
不大于64
- 输出的数组各元素在
-128
~128
范围内,包含边界具体要求
输入要求
首先读入nums1
数组的元素个数n1
接下来,每行读取一个元素 nums1[i],共读取 n1 行
然后读入nums2
数组的元素个数n2
接下来,每行读取一个元素 nums2[i],共读取 n2 行输出要求
逐一输出合并后的 nums 数组元素 nums[i],每个 nums[i] 之间以空格分隔
最后一个 nums[i] 后面有无空格都可以样例输入1
text1
2
3
4
5
6
7
83
1
2
2
3
2
7
8样例输出1
text1
1 2 2 2 7 8
样例输入2
text1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
178
-9
0
2
4
4
4
4
9
7
-3
2
4
6
6
6
9样例输出2
text1
-9 -3 0 2 2 4 4 4 4 4 6 6 6 9 9
求解思路
我用C语言代码来解释最核心的处理逻辑,你可以自行将其翻译成MIPS。c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//前面已经读入了所有给定的输入
int i = 0, j = 0;
while (i + j < n1 + n2)
{
if (j >= n2 || (nums1[i] <= nums2[j] && i < n1))
{
//如果nums2已经读完,或者nums1[i]小于等于nums2[j]且nums1还没读完
printf("%d ", nums1[i]);
i++;
}
else
{
printf("%d ", nums2[j]);
j++;
}
}
T1&T2
说明
由于T1和T2在考试时提供了相应的C语言代码。
不熟练的同学建议直接翻译,保证测试拿分才是最主要的。
由于自身实力有限,我也采用了这种方法,因此这里就不介绍题意,分享一些MIPS的常用模板。
MIPS常用模板
宏模版
mips
1 | # 结束程序 |
主程序模版
mips
1 | # for (int i = 0; i < n; i++){...},下面$t0为i,$s0为n |
助教问答环节
这部分只提供问题。
- 1号寄存器和$sp寄存器的作用是什么?
- 哪两个寄存器是保留给操作系统的?
- 如何将MIPS汇编导出为二进制代码?
- .word伪指令和.space的区别是什么?
- 请你简述T0题的求解思路。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MossDream's Blog!
评论