试卷解析 · 理解每一步
2024-12-Level-8
2024-12-Level-8
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题,2 分)
小杨家响应国家“以旧换新”政策,将自家的汽油车置换为新能源汽车,正在准备自编车牌。自编车牌包括5位数字或英文字母,要求第5位必须是数字,前4位中可以有最多1位英文字母。英文字母必须是大写,而且不能是O或I(因为容易与数字0或1混淆)。请问自编车牌共有多少种可能性?()。
正确答案B
解析详情
若前四位全是数字,五个位置各有 10 种选择,共 种。
若恰有一个字母,字母位置有 4 种,字母除去 O、I 后有 24 种,其他四个位置均为数字,共 种。
两类相加得 1060000,选 B。
第 2 题(单选题,2 分)
新年到,四家人在一起聚会。其中两家有三口人,另外两家有两口人。现在要安排大家在一张十人圆桌坐下,要求一家人必须相邻就座。由于有“主座”的习俗,每个座位都被认为是不同的。请问共有多少种就座方案?()。
正确答案A
解析详情
先把每家视为一个连续整体,四个家庭绕圆桌的相对次序有 种。
家庭内部排列数为 。由于座位不同,整圈再有 10 种旋转位置。
总数为 ,选 A。
第 3 题(单选题,2 分)
下面关于C++类继承的说法,错误的是()。
正确答案D
解析详情
含纯虚函数等情形可使类成为抽象类,这种类不能直接实例化,但可以合法地只声明和定义而暂时没有派生类。
因此“必须至少被一个类继承,否则编译错误”错误,选 D。C++ 支持多继承,也允许多层继承。
第 4 题(单选题,2 分)
使用邻接表表达一个简单有向图,图中包含 v 个顶点、e 条边,则该出边表中边节点的个数为()。
正确答案D
解析详情
每条有向边 u→v 只在起点 u 的出边表中记录一次。
所以 e 条有向边恰好产生 e 个边结点,选 D;顶点表头的 v 个结点不计入边结点数。
第 5 题(单选题,2 分)
以下将二维数组作为参数的函数声明,哪个是符合语法的?()。
正确答案C
解析详情
int (*a)[20] 中括号让 a 先与 * 结合,表示指向“含 20 个 int 的一维数组”的指针,能接收列数为 20 的二维数组名,选 C。
int *a[20] 则是指针数组形参,会调整为 int **,语法本身可合法,但不匹配普通连续二维 int 数组。
第 6 题(单选题,2 分)
已知两个点 A、B 在平面直角坐标系下的坐标分别为和,并分别定义变量 double xa,ya,xb,yb;存储坐标。假设直线 AB 的斜率存在,下列哪个表达式可以用来表达它?()。
正确答案C
解析详情
斜率等于纵坐标变化量除以横坐标变化量:。
分子分母同时从 A 减 B,方向一致,对应 C。题目保证斜率存在,即两个点的横坐标不同。
第 7 题(单选题,2 分)
二项式的展开式中项的系数是()。
正确答案C
解析详情
六个 (x+y) 相乘,要得到 ,需选择 3 个因子取 x,另外 3 个取 y。
选择数为 ,所以选 C。
第 8 题(单选题,2 分)
以下关于动态规划的说法中,错误的是()。
正确答案B
解析详情
记忆化递归按需计算状态,递推通常按照既定顺序填表。若只会用到全部状态中的少数,记忆化递归可能访问更少的状态。
若两种实现访问同样状态、转移代价相同,其渐进复杂度也可能相同。因此“递归时间复杂度总是不低于递推”过于绝对,选 B。
第 9 题(单选题,2 分)
在下面的程序中,使用整数表示一种组合。整数二进制表示的某一位为1,表示该位对应的数被选中,反之为0表示未选中。例如,从0 - 5这6个数中选出3个,则0b111000代表选中3,4,5三个数,0b011001代表选中0,3,4三个数。zuhe_next函数按组合对应的整数由大到小的顺序,求出组合c的下一个组合。横线处可以填入的是()。
int intlow2(int c) {
return ___; // 在此处填入选项
}
int zuhe_next_incur(int c, int n, int l) {
if (n == 1) return c;
if ((c & (1 << 1)) == 0) {
int d = intlow2(c);
c = (c & ~d);
c = (c | (d >> 1));
} else {
c = (c & ~(1 << 1));
c = zuhe_next_incur(c, n - 1, l + 1);
int d = intlow2(c);
c = (c | (d >> 1));
}
return c;
}
// 从n个数中选m个,当前组合为c
int zuhe_next(int c, int n, int m) {
return zuhe_next_incur(c, n, 0);
}正确答案D
解析详情
(c-1)^c 会得到从最低位 1 开始向右的连续全 1 掩码。若要只保留原来最低的那一位 1,就先加 1 形成更高位的单独 1,再右移 1 位。
因此 `intlow2(c)` 应写成 `((((c - 1)^c) + 1) >> 1)`,选 D。
第 10 题(单选题,2 分)
下面程序的输出为()。
#include <iostream>
using namespace std;
int main() {
int N = 15, cnt = 0;
for (int x = 0; x + x + x <= N; x++)
for (int y = x; x + y + y <= N; y++)
for (int z = y; x + y + z <= N; z++)
cnt++;
cout << cnt << endl;
return 0;
}正确答案A
解析详情
循环恰好枚举 且 的三元组,每组计数一次。
固定 x、y 后,z 从 y 到 15−x−y,共 16−x−2y 个。x 可为 0 到 5,对各自合法 y 求和,分别得到 72、49、30、16、6、1。
合计 ,选 A。
第 11 题(单选题,2 分)
下面最长公共子序列程序中,横线处应该填入的是()。
#define MAX(A, B) ((A) > (B)) ? (A) : (B))
#define MIN(A, B) ((A) < (B)) ? (A) : (B))
int dp[MAX_L + 1][MAX_L + 1];
int LCS(char str1[], char str2[]) {
int len1 = strlen(str1);
int len2 = strlen(str2);
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
if (str1[i] == str2[j])
dp[i + 1][j + 1] = dp[i][j] + 1;
else
// 在此处填入选项
return dp[len1][len2];
}
}正确答案C
解析详情
当 `str1[i] != str2[j]` 时,LCS 只能来自“去掉 str1[i]”或“去掉 str2[j]”这两个子问题,因此转移应取两者较大值。
所以应填 `dp[i + 1][j + 1] = MAX(dp[i][j + 1], dp[i + 1][j])`,选 C。
第 12 题(单选题,2 分)
下列Dijkstra算法中,横线处应该填入的是()。
typedef struct Edge {
int in, out; // 从下标in顶点到下标out顶点的边
int len; // 边长度
struct Edge * next;
} Edge;
// v: 顶点个数, graph: 出边邻接表, start: 起点下标, dis: 输出每个顶点的最短距离
void dijkstra(int v, Edge * graph[], int start, int * dis) {
const int MAX_DIS = 0x7fffff;
for (int i = 0; i < v; i++)
dis[i] = MAX_DIS;
dis[start] = 0;
int * visited = new int[v];
for (int i = 0; i < v; i++)
visited[i] = 0;
visited[start] = 1;
for (int t = 0; ; t++) {
int min = MAX_DIS, minv = -1;
for (int i = 0; i < v; i++) {
if (visited[i] == 0 && min > dis[i]) {
min = dis[i];
minv = i;
}
}
if (minv < 0)
break;
visited[minv] = 1;
for (Edge * e = graph[minv]; e != NULL; e = e->next) {
___ // 在此处填入选项
}
}
delete[] visited;
}正确答案B
解析详情
当前已确定的顶点是 `minv`,其最短距离为 `min`。沿出边 `e` 松弛时,应检查经过 `minv` 到 `e->out` 是否更短,即 `dis[e->out] > min + e->len`。
因此更新语句应写成 B,目标点也是 `e->out` 而不是 `e->in`。
第 13 题(单选题,2 分)
假设图 graph 中顶点数 v、边数 e,上题程序的时间复杂度为()。
正确答案B
解析详情
这份代码每轮都线性扫描全部 v 个顶点来找当前最小未访问点,这一步重复 v 次,代价是 O(v^2)。
遍历所有邻接表总共再花 O(e),合起来是 O(v^2+e),通常记作 O(v^2),选 B。
第 14 题(单选题,2 分)
下面的快速排序程序中,两处横线处分别应填入的是()。
void quick_sort(int a[], int n) {
if (n <= 1)
return;
int pivot = 0, l = 0, r = n - 1;
while (____) { // 在此处填入选项
while (r > pivot && a[r] >= a[pivot])
r--;
if (r > pivot) {
int temp = a[pivot];
a[pivot] = a[r];
a[r] = temp;
pivot = r;
}
while (l < pivot && a[l] <= a[pivot])
l++;
if (l < pivot) {
int temp = a[pivot];
a[pivot] = a[l];
a[l] = temp;
pivot = l;
}
}
quick_sort(a, pivot);
quick_sort(____); // 在此处填入选项
}正确答案A
解析详情
左右指针未相遇时继续分区,因此外层应为 l<r。若写 l<=r,相遇时内层不再移动,可能形成死循环。
pivot 就位后,左段长度为 pivot;右段从 a+pivot+1 开始,长度为 n−pivot−1,必须排除枢轴本身。
两处合起来对应 A。
第 15 题(单选题,2 分)
上题程序的时间复杂度为()。
正确答案D
解析详情
按通常平均情况分析,一次分区扫描当前区间,耗时 ;划分相对均衡时有 层。
每层总处理量为 ,因此平均时间复杂度为 ,选 D。
本实现以首元素开始选枢轴,已有序等输入可能连续产生极不均衡划分,最坏仍为 。
判断题
第 1 题(判断题,2 分)
表达式 '3' + '5' 的结果为 '8',类型为 char。
正确答案错误
解析详情
字符参与加法时通常先提升为 int。在 ASCII 编码下,'3'=51、'5'=53,相加得到整数 104。
'8' 的编码为 56,与 104 不同,而且表达式类型也不是 char,故题目错误。
第 2 题(判断题,2 分)
在C++语言中,可以在函数内定义结构体,但该结构体类型只能在该函数内使用。
正确答案正确
解析详情
可以在函数内定义 struct,例如在 f 中定义 struct Node { int x; };。该类型名属于对应的局部作用域,函数外不能直接用这个局部名字声明对象。
因此按题目关于类型名可见性的通常含义判断正确。
第 3 题(判断题,2 分)
对n个元素的数组进行排序,快速排序和归并排序的平均时间复杂度都为。但快速排序存在退化情况,使得时间复杂度升高至;归并排序需要额外的空间开销。
正确答案正确
解析详情
快速排序平均能把区间分成较均衡的两部分,平均为 ;若每次只分出一个元素,工作量成为 n+(n−1)+⋯+1,即 。
归并排序固定二分,再线性合并,通常为 ,但数组归并需要额外缓冲区。因此描述正确。
第 4 题(判断题,2 分)
二维数组的最后一维在内存中一定是连续的,但第一维在内存中可能不连续。
正确答案错误
解析详情
普通 C++ 二维数组是“数组的数组”,所有元素按行连续存储。例如 int a[2][3] 的六个元素依次是第一行三个,再接第二行三个。
每行内部连续,各行之间也连续,因此“第一维可能不连续”错误。
第 5 题(判断题,2 分)
使用 math.h 或 cmath 头文件中的函数,表达式的结果类型为 double、值约为 3。
正确答案错误
解析详情
cmath 中 log 表示以 e 为底的自然对数,所以 ,不是 3。
以 10 为底的函数是 log10,log10(1000) 才约为 3,因此题目错误。
第 6 题(判断题,2 分)
你有三种硬币,分别面值2元、5元和7元,每种硬币都有足够多。买一本书需要27元,则有8种硬币组合(组合与顺序无关,“1个2元+1个5元+1个2元”与“1个5元+2个2元”认为是同样的组合)可以正好付清,且不需要对方找钱。
正确答案正确
解析详情
设 2、5、7 元硬币分别取 a、b、c 枚,则 ,三者为非负整数。按 c=0、1、2、3 分类。
c=0 时 b=1、3、5,共 3 种;c=1 时 b=0、2、4,共 3 种;c=2 时 b=1,共 1 种;c=3 时 b=0,共 1 种。
每种情况 a 都由剩余金额唯一确定,总数 ,所以正确。
第 7 题(判断题,2 分)
使用哈希函数建立键值为 int 类型的哈希表,只要 p 取小于等于哈希表大小的素数,可保证不发生碰撞。
正确答案错误
解析详情
无论 p 是否为素数,x 和 x+p 都满足相同的模 p 余数,因此仍会哈希到同一个表项。
例如 p=7 时,1 和 8 均映射到 1。取素数可能改善某些数据的分布,但不能保证无碰撞,故错误。
第 8 题(判断题,2 分)
杨辉三角中的第n行、第m项,即为将二项式展开后项的系数。
正确答案错误
解析详情
按题目通常从第 1 行、第 1 项开始编号,第 n 行第 m 项为 ,对应 的系数。
题中 在 中的系数是 ,对应从 0 开始的另一套编号,因此判断错误。
例如第 2 行第 1 项为 1,而 中 ab 的系数为 2。
第 9 题(判断题,2 分)
判断图是否连通,可以通过广度优先搜索实现。
正确答案正确
解析详情
对于无向图,从任一顶点入队开始 BFS,每当发现未访问邻点就标记并入队。
若队列处理结束后访问了所有顶点,图连通;若仍有未访问顶点,则不连通。因此可以通过 BFS 实现。
第 10 题(判断题,2 分)
要求解一元二次方程,需要先判断表达式是否为真。
正确答案错误
解析详情
若只讨论实数解,`x^2+ax+b=0` 的判别式确实是 `a^2-4b`。但题目说“要求解方程就需要先判断该条件是否为真”过于绝对,因为并不是所有求解场景都只限于实数范围。
因此这个断言按题目表述应判为错误。