一、单项选择题(共15题)
每题只有一个正确选项,绿色为正确答案,并附简要解析。
1. 在 24*24 的点阵的字库里,汉字“一”和“编”的字模占用字节数分别是( )。
A. 72、72
B. 32、32
C. 32、72
D. 72、32
答案:A。24×24 点阵共 576 位,每个汉字占 576/8=72 字节。
2. 在计算机中通常用英文单词“BYTE”来表示( )。
答案:D。BYTE 是字节,通常等于 8 个二进制位。
3. 已知一棵二叉树的前序遍历结果为 ABCDEF,中序遍历结果为 CBAEDF,则后序遍历的结果为( )。
A. CBEFDA
B. FEDCBA
C. CBEDFA
D. EDCBFA
答案:A。由前序和中序还原:根为 A,左子树后序为 CB,右子树后序为 EFD,所以整棵树后序为 CBEFDA。
4. 对一个满二叉树,m 个叶结点,n 个结点,则( )。
A. n=m+1
B. 2n=m+1
C. n=m-1
D. n=2m-1
答案:D。满二叉树满足叶结点数比度为 2 的结点数多 1,因此总结点数为 2m-1。
5. 下列叙述中,正确的是( )。
A. 线性表的线性存储结构优于链表存储结构
B. 队列的操作方式是先进后出
C. 栈的操作方式是先进先出
D. 二维数组是指它的每个数据元素为一个线性表的线性表
答案:D。二维数组可看作元素仍为线性表的一维数组;其余三项都错误。
6. 如果某二叉树的前序为 STUWV,中序为 UWTVS,那么该二叉树的后序是( )。
A. WUVTS
B. UWVTS
C. VWUTS
D. WUTSV
答案:A。由前序和中序还原二叉树后,后序遍历结果为 WUVTS。
7. 表达式 (a+b)*c-d/e 的后缀表达式为( )。
A. ab+cde-*/
B. -*+abc/de
C. ab+c*de/-
D. abc*+de/
答案:C。先算 a+b,再乘 c,最后减去 d/e,后缀为 ab+c*de/-。
8. 计算机的软件系统通常分为( )。
A. 硬件系统和软件系统
B. 高级软件和一般软件
C. 系统软件和应用软件
D. 军用软件和民用软件
答案:C。软件系统通常分为系统软件和应用软件两大类。
9. 下列描述计算机病毒的特性中,( )不是正确的。
答案:C。病毒常见特性包括潜伏性、传染性和危害性,“高速性”不是标准特征表述。
10. 一颗完全二叉树的结点总数为 41,其叶结点数( )。
A. 18 个
B. 19 个
C. 20 个
D. 21 个
答案:D。完全二叉树叶结点数为 ceil(n/2),即 21。
11. 由 4 个节点构成的形态不同的二叉树有( )种。
答案:B。不同形态二叉树数量满足卡特兰数,4 个节点对应 C_4 = 14。
12. 一棵完全二叉树,共有 1234 个节点,其叶子结点的个数为( )。
答案:C。完全二叉树叶子结点数为 ceil(n/2),所以 ceil(1234/2)=617。
13. 一棵树 T 有 2 个度数为 2 的结点,有 1 个度数为 3 的结点,有 3 个度数为 4 的结点,那么树 T 有( )个树叶。
答案:A。树中叶子数满足 n_0 = 1 + \sum (i-1)n_i,所以 1 + 1×2 + 2×1 + 3×3 = 14。
14. 总共有 6 个不同的元素进栈,能得到( )种不同的出栈序列。
答案:C。不同出栈序列数量等于第 6 个卡特兰数,结果为 132。
15. 23|15+9^16&69 的结果是( )。
答案:A。按优先级先算 15+9=24 和 16&69=0,再得 24^0=24,最后 23|24=31。
二、阅读程序题(共8题)
(一)阅读下面的程序代码,回答 16~19 题
代码功能:函数 co(i1) 用递推乘除的方式计算组合数 C(10,i1)。主函数先用 s=n+1 表示 C(10,0)+C(10,1),再累加 C(10,2) 到 C(10,10),最终输出所有组合数之和 2^10=1024。
16. 将 17 行 i=2 改为 i=1,程序运行结果不会发生变化。
答案:B。原程序中 s=n+1=11 已经包含了 C(10,0)+C(10,1),若再从 i=1 开始,会把 C(10,1) 重复计算。
17. 将 08 行的 j1 去掉,程序运行结果不会发生变化。
答案:A。第 10 行的 for (int j1 ...) 已经重新定义了循环变量,去掉第 8 行中的 j1 不影响结果。
18. 当 i1=4 时,函数 co(i1) 的返回值为( )。
A. 120
B. 210
C. 252
D. 45
答案:B。函数 co(i1) 计算的是组合数 C(10,i1),因此 co(4)=C(10,4)=210。
19. 程序输出为( )。
A. s=512
B. s=1024
C. s=256
D. s=2048
答案:B。程序计算的是 C(10,0)+C(10,1)+...+C(10,10),总和为 2^10=1024。
(二)阅读下面的程序代码,回答 20~23 题
代码功能:程序定义递归函数 fun(x):当 x 为 0 或 1 时返回 3,否则返回 x-fun(x-2)。主函数计算并输出 fun(9),递归只沿着奇数项回退,依次得到 fun(1)=3、fun(3)=0、fun(5)=5、fun(7)=2、fun(9)=7。
20. 将 04 行改为 if(x<=1) return(7 & 3);,程序输出结果不变。
答案:A。7 & 3 的结果仍为 3,而本程序递归过程中只会遇到 x=1 或 x=0 的基准情形,所以输出不变。
21. 将 03 行的 inline 去掉,程序可以正常运行。
答案:A。inline 只是给编译器的内联建议,不影响函数语义,去掉后仍可正常编译运行。
22. 程序输出结果为( )。
答案:C。递推可得 fun(1)=3,fun(3)=0,fun(5)=5,fun(7)=2,所以 fun(9)=9-2=7。
23. 将 08 行的 fun(9) 改成 fun(10),输出为( )。
答案:A。由前面的递推继续计算,fun(8)=7,因此 fun(10)=10-7=3。
三、完善程序(共5题)
(一)根据题意,完成下面程序
(统计个数)给出 n 个数,统计每个数能看到的数字个数。
例如:2 5 1 3 4。第一个数字 2 可以看到 5;第二个数字 5 可以看到 2、1、3、4;第三个数字 1 可以看到 5、3、4;第四个数字 3 可以看到 1、5、4;第五个数字 4 可以看到 3、5。
代码功能:程序读入 n 个数字,对每个位置 i 统计它左右两侧能看到的数字个数。相邻数字一定可见;继续向左或向右扫描时,只有遇到比当前已看到最高数字更大的数字,才会新增一个可见数字,所以用 now 记录扫描方向上的最高值,用 b[i] 保存答案。
24. ①处应填( )。
A. a[i - 1]
B. a[i]
C. a[i + 1]
D. a[i] + 1
答案:A。向左扫描前,应先把当前左侧紧邻元素作为初始可见高度。
25. ②处应填( )。
答案:C。对中间位置的数字,左右紧邻的两个数字必然都能看到,因此初值应先记为 2。
26. ③处应填( )。
A. i-1
B. i-2
C. i+1
D. i+2
答案:B。左侧紧邻元素已作为初始高度处理,因此循环应从 i-2 继续向左扫描。
27. ④处应填( )。
A. a[i - 1]
B. a[i]
C. a[i + 1]
D. a[i] + 1
答案:C。向右扫描前,应先把当前右侧紧邻元素作为初始可见高度。
28. ⑤处应填( )。
A. i-1
B. i-2
C. i+1
D. i+2
答案:D。右侧紧邻元素已作为初始高度处理,因此循环应从 i+2 开始继续向右扫描。