某平台生成 6 位“取件码”:前 4 位为数字(0–9),后 2 位为大写字母(A–Z),其中字母 不允许 为 I 或 O。数字与字母均允许重复。要求整个取件码中(即前 4 位数字里)恰好有 位是奇数。问不同取件码数量为多少?
B:2160000。前 4 位选 2 个位置放奇数 C(4,2)=6,奇、偶数位各 5 种(5²×5²);后 2 位字母不含 I、O 共 24² 种;共 6×25×25×576=2160000。
下面给出归并排序(Merge Sort)的递归框架,函数将区间 [l,r](闭区间)排序。横线处应补上哪一句,才能正确排序并进入合并?
01void merge_sort(int a[], int l, int r) { 02 if (l >= r) return; 03 int mid = (l + r) / 2; 04 merge_sort(a, l, mid); 05 _________ // 在此处填入选项 06 merge(a, l, mid, r); // 合并操作 07}
B:merge_sort(a, mid+1, r)。区间是闭区间 [l,r],左半 [l,mid]、右半 [mid+1,r] 无缝划分;A 会重复 mid,C、D 越界或漏元素。
某社团有男生 8 人、女生 7 人。要选出:1 名班长、1 名副班长、2 名宣传委员(两人无角色区别,且必须至少 1 名女生)。同一人不能兼任多个岗位。问不同选法有多少种?
A:12012。按两名宣传委员分类:两女 C(7,2)=21,一男一女 7×8=56;再从剩余 13 人中选班长、副班长 P(13,2)=156;共 (21+56)×156=12012。
求 的展开式中 项的系数。
C:−1792。通项 C(8,k)(2x)^(8−k)(−y)^k,令 k=3:C(8,3)·2⁵·(−1)³=56×32×(−1)=−1792,负号来自 (−y)³。
下面是使用邻接矩阵实现的 Dijkstra 算法的核心片段,用于求单源最短路径。在找到当前距离起点最近的顶点 后,需要更新其邻接点 的距离。横线处应填入的代码是( )。
01for (int j = 1; j <= n; j++) { 02 if (!visited[j] && graph[u][j] < INF) { 03 if ( ________ ) { // 在此处填入选项 04 dis[j] = dis[u] + graph[u][j]; 05 } 06 } 07}
B:dis[j] > dis[u]+graph[u][j]。经 u 中转的路径更短时才更新 dis[j];A 方向相反会保留更长距离,C、D 比较对象错误。
下面程序使用动态规划求两个字符串的最长公共子序列(LCS)长度,横线处应填入的是( )。
01#include <algorithm> 02#include <string> 03#include <vector> 04using namespace std; 05 06int lcs_len(const string &a, const string &b) { 07 int n = (int)a.size(), m = (int)b.size(); 08 vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); 09 for (int i = 1; i <= n; i++) 10 for (int j = 1; j <= m; j++) 11 if (a[i - 1] == b[j - 1]) 12 dp[i][j] = dp[i - 1][j - 1] + 1; 13 14 else 15 ________; // 在此处填入选项 16 return dp[n][m]; 17}
C:dp[i][j]=max(dp[i-1][j], dp[i][j-1])。末尾字符不等时 LCS 只能来自去掉 a 尾或 b 尾的子问题,取较大值;A 求和、B 取小、D 多加 1 均错。
已知两个点 、。在平面直角坐标系中的坐标。下列 C++ 表达式中,能正确计算这两点之间直线距离的是( )。
B:欧氏距离=√(Δx²+Δy²),用 pow 求平方再开方;A 的 ^ 是按位异或而非乘方,C 缺少开方,D 是曼哈顿距离。
已知:int a = 10;,执行 int &b = a; b = 20; 后,变量 的值是( )。
B:20。b 是 a 的引用即 a 的别名,二者共享同一存储单元,b=20 直接写入该单元,故 a 的值变为 20,输出即 20。
下列代码的时间复杂度(以 n 为自变量,忽略常数与低阶项)是
01long long s = 0; 02for (int i = 1; i <= n; i++) { 03 for (int j = 1; j * j <= i; j++) { 04 s += j; 05 } 06}
C:O(n√n)。内层循环次数为 √i,总操作 ∑_{i=1}^{n}√i≈(2/3)n^{3/2},忽略常数即 O(n√n)。
下列程序实现了线性筛法(欧拉筛),用于在 时间内求出 之间的所有质数。为了保证每个合数只被其最小质因子筛掉,横线处应填入的语句是( )。
01for (int i = 2; i <= n; i++) { 02 if (!not_prime[i]) primes[++cnt] = i; 03 for (int j = 1; j <= cnt && i * primes[j] <= n; j++) { 04 not_prime[i * primes[j]] = true; 05 if (________) break; // 在此处填入选项 06 } 07}
C:i%primes[j]==0。当 primes[j] 是 i 的最小质因子时 break,保证更大的 primes[j+1]·i 会由更小的质因子在后续被筛掉,每个合数只筛一次。
在 C++ 语言中,关于类的继承和访问权限,下列说法正确的是( )。
C:构造派生类对象时先执行基类构造函数再执行派生类构造函数;A 中基类 private 成员派生类不可直接访问,B 私有继承下 protected 成员变为 private,D 析构顺序应相反。
当输入 6 时,下列程序的输出结果为( )。
01#include <iostream> 02using namespace std; 03int f(int n) { 04 if (n <= 3) return n; 05 return f(n - 1) + f(n - 2) + 2 * f(n - 3); 06} 07int main() { 08 int n; 09 cin >> n; 10 cout << f(n) << endl; 11 return 0; 12}
B:27。递推 f(n)=f(n-1)+f(n-2)+2f(n-3),边界 f(1..3)=1,2,3:f(4)=3+2+2=7,f(5)=7+3+4=14,f(6)=14+7+6=27。
从 到 这 个正整数中,十进制表示中数字 恰好出现一次的数有多少个?( )
A:243。按位数分类:1 位数 1 个;2 位数十位 5(个位 9 种)加个位 5(十位 8 种)共 17;3 位数百位 5(9×9)、十位 5(8×9)、个位 5(8×9)共 225;合计 243。
当输入 2023 时,下列程序的输出结果为( )
01#include <iostream> 02using namespace std; 03int main() { 04 int x, ans = 0; 05 cin >> x; 06 while (x != 0) { 07 x -= x & -x; 08 ans++; 09 } 10 cout << ans << endl; 11 return 0; 12}
C:9。x-=x&-x 每次去掉最低位的 1,ans 统计二进制中 1 的个数;2023=1024+512+256+128+64+32+4+2+1 恰含 9 个 1,故输出 9。
对连通无向图执行 Kruskal 算法。已按边权从小到大依次扫描到某条边 。此时在已经构建的部分 MST 结构中, 已在同一连通块内。关于边 的处理,下列说法正确的是( )。
B:Kruskal 按边权升序扫描,u、v 已在同一连通块说明选 e 必成环,在该扫描顺序下一定舍弃;贪心决策不回退,A、C、D 均错误。
若一项任务可用两种互斥方案完成:方案 A 有 种做法,方案 B 有 种做法,则总做法数为 。
A:正确。两种方案互斥、不能同时发生,完成任务的任一做法都能达成目标,总做法数相加 m+n,这就是分类加法计数原理,与分步乘法相对。
在 C++ 语言中,引用一旦被初始化,就不能再改为引用另一个变量。
A:正确。引用必须在定义时初始化,一经绑定就永远指向该对象;之后对引用的赋值只是修改目标值,无法让引用改指别的变量,与指针不同。
快速排序和归并排序的平均时间复杂度都是 ,但快速排序是不稳定的排序算法,归并排序是稳定的排序算法。
A:正确。快排平均 O(n log n),但划分中的交换会打乱相等元素相对次序,不稳定;归并合并时相等元素先取左段,稳定。
使⽤ math.h 或 cmath 头⽂件中的函数,表达式 sqrt(4) 的结果类型为 double。
A:正确。sqrt 的参数与返回值都是 double,sqrt(4) 得到 double 类型的 2.0,而不是 int 2。
在杨辉三角形中,第 行(从 开始计数,即第 行有 个数)的所有数字之和等于 。
A:正确。杨辉三角第 n 行即 (a+b)ⁿ 的系数,令 a=b=1 得各行和为 (1+1)ⁿ=2ⁿ,是二项式定理的直接推论。
使用二叉堆优化的 Dijkstra 最短路算法,在某些特殊情况下时间复杂度不如朴素实现的 。
A:正确。稠密图中 E≈V²,堆优化复杂度 O((V+E)log V)≈O(V² log V) 反超朴素实现的 O(V²);堆优化的优势在稀疏图。
个不同元素依次入栈的出栈序列数与将 个不同元素划分成若干非空子集的方案数相等。
B:错误。n 个元素出栈序列数是卡特兰数 Cₙ,划分成非空子集数是贝尔数 Bₙ;n=4 时 C₄=14 而 B₄=15,仅在 n≤3 时巧合相等。
快速排序在最坏情况下的时间复杂度为 ,可以通过随机化选择基准值(pivot)的方法完全避免退化。
B:错误。快排最坏情况仍是 O(n²)(如每次选到极值基准),随机化只能以极大概率避免退化,不能『完全避免』;最坏 O(n log n) 是堆排或归并。
在C++语言中,一个类可以拥有多个构造函数,也可以拥有多个析构函数。
B:错误。构造函数可以重载多个,但析构函数没有参数列表、不能重载,一个类只能定义一个析构函数,这点与构造函数不同,重载只适用于构造。
求两个序列的最长公共子序列(LCS)时,使用滚动数组优化空间后,仍然可以还原出具体的 LCS 序列。
B:错误。滚动数组只保留最近两行 dp,回溯构造 LCS 所需的完整路径信息已丢失,只能得到长度、无法还原具体序列;要还原需保存完整二维表。