c++评估卷1

C++ 120分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2分 单选
给定一个整数数组nums,下面代码找到一个具有最大和的连续子数组,并返回该最大和。则下面说法错误的是( )。

A. 上述代码采用分治算法实现
B. 上述代码采用贪心算法
C. 上述代码时间复杂度为O(n log n)
D. 上述代码采用递归方式实现
第2题 中级 2分 单选
下面的C++代码用于在升序数组lst中查找目标值target最后一次出现的位置。相关说法,正确的是( )。

A. 当lst中存在重复的target时,该函数总能返回最后一个target的位置,即便lst全由相同元素组成
B. 当target小于lst中所有元素时,该函数会返回0
C. 循环条件改为while (low <= high)程序执行效果相同,且能提高准确性
D. 将代码中(low + high + 1) / 2修改为(low + high) / 2效果相同
第3题 中级 2分 单选
链表不具备的特点是( )。
A. 可随机访问任何一个元素
B. 插入、删除操作不需要移动元素
C. 无需事先估计存储空间大小
D. 所需存储空间与存储元素个数成正比
第4题 中级 2分 单选
假设双向循环链表包含头尾哨兵结点(不存储实际内容),分别为head和tail,链表中每个结点有两个指针域prev和next。下面代码实现了一个空的双向循环链表,

A. list->head->prev = list->head; list->tail->prev = list->head;
B. list->head->next = list->tail; list->tail->prev = list->head;
C. list->head->next = list->tail; list->tail->next = list->head;
D. list->head->next = list->tail; list->tail->next = nullptr;
第5题 中级 2分 单选
下面关于链表和数组的描述,错误的是( )。
A. 当数据数量不确定时,为了应对各种可能的情况,需要申请一个较大的数组,可能浪费空间;此时用链表比较合适,大小可动态调整。
B. 在链表中访问节点的效率较低,时间复杂度为O(n)。
C. 链表插入和删除元素效率较低,时间复杂度为O(n)。
D. 链表的节点在内存中是分散存储的,通过指针连在一起。
第6题 中级 2分 单选
下面关于归并排序,描述正确的是( )。
A. 归并排序是一个不稳定的排序算法。
B. 归并排序的时间复杂度在最优、最差和平均情况下都是O(n log n)。
C. 归并排序需要额外的O(1)空间。
D. 对于输入数组{12,11,13,5,6,7},代码输出结果为:7 6 5 13 12 11。
第7题 中级 2分 单选
给定一个长度为n的有序数组nums,其中所有元素都是唯一的。下面的函数返回数组中元素target的索引。关于上述函数,描述不正确的是( )。

A. 函数采用二分查找,每次计算搜索当前搜索区间的中点,然后根据中点的元素值排除一半搜索区间。
B. 函数采用递归求解,每次问题的规模减小一半。
C. 递归的终止条件是中间元素的值等于target,若数组中不包含该元素,递归不会终止。
D. 算法的复杂度为O(log n)。
第8题 中级 2分 单选
关于分治算法,以下哪个说法正确?
A. 分治算法将问题分成子问题,然后分别解决子问题,最后合并结果。
B. 归并排序不是分治算法的应用。
C. 分治算法通常用于解决小规模问题。
D. 分治算法的时间复杂度总是优于O(n²)。
第9题 中级 2分 单选
下述代码实现素数表的线性筛法,筛选出所有小于等于n的素数,则横线上应填的代码是( )。

A. for (int j = 0; j < primes.size() && i * primes[j] <= n; j++)
B. for (int j = 0; j <= sqrt(n) && i * primes[j] <= n; j++)
C. for (int j = 0; j <= n; j++)
D. for (int j = 1; j <= sqrt(n); j++)
第10题 中级 2分 单选
上题代码的时间复杂度是( )。
A. O(n)
B. O(n log n)
C. O(n log log n)
D. O(√n)
第11题 中级 2分 单选
为了正确实现快速排序,下面横线上的代码应为( )。

A. while (i <= mid)
B. while (i < mid)
C. while (i < j)
D. while (i <= j)
第12题 中级 2分 单选
辗转相除法也被称为( )
A. 高斯消元法
B. 费马定理
C. 欧几里德算法
D. 牛顿迭代法
第13题 中级 2分 单选
归并排序的基本思想是( )。
A. 动态规划
B. 分治
C. 贪心算法
D. 回溯算法
第14题 中级 2分 单选
在快速排序中,选择的主元素(pivot)会影响算法的( )。
A. 不影响
B. 时间复杂度
C. 空间复杂度
D. 时间复杂度和空间复杂度
第15题 中级 2分 判断
归并排序的时间复杂度是O(n log n)。( )
T. 正确
F. 错误
第16题 中级 2分 判断
小杨在生日聚会时拿一块H*W的巧克力招待来的K个小朋友,保证每位小朋友至少能获得一块相同大小的巧克力。那么小杨想分出来最大边长的巧克力可以使用二分法。( )
T. 正确
F. 错误
第17题 中级 25分 编程
小杨的幸运数

小杨认为,所有大于等于a的完全平方数都是他的超级幸运数。
小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。
对于一个非幸运数,小杨规定,可以将它一直+1,直到它变成一个幸运数。我们把这个过程叫做幸运化。
现在,小杨给出T个数,请你首先判断它们是不是幸运数;接着,对于非幸运数,请你将它们幸运化。

【输入格式】
第一行2个正整数a和T。
接下来T行,每行一个正整数x,表示需要判断(幸运化)的数。
【输出格式】
输出T行,对于每个给定的x,如果它是幸运数,请输出lucky,否则请输出将其幸运化后的结果。
【样例输入】

2 4
1
4
5
9
【样例输出】

4
lucky
8
lucky
对于所有测试点,保证1<=a<=10^6;保证1<=T<=10^5;保证1<=x<=10^6。
第18题 中级 25分 编程
烹饪问题

有N种食材,编号从1至N,其中第i种食材的美味度为ai。
不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为x和y,那么它们的契合度为x & y。
其中,&运算为按位与运算。现在,请你找到契合度最高的两种食材,并输出它们的契合度。

【输入格式】
第一行一个整数N,表示食材的种数。
接下来一行N个用空格隔开的整数,依次为a1到aN,表示各种食材的美味度。
【输出格式】
输出一行一个整数,表示最高的契合度。
【样例输入1】

3
1 2 3
【样例输出1】

2
【样例输入2】

5
5 6 2 10 13
【样例输出2】

8
对于所有测试点,保证2<=N<=10^6,1<=ai<=2^31-1。
第19题 中级 2分 单选
有若干根木头,长度存于 wood 。每切一刀可以把一段木头分成两段。函数 check(wood, K, x) 返回: 用不超过 K 刀,能否使所有木段长度都不超过 x 。下面代码使用二分答案查找最小可行的 x ,横线处应填( )

int binary_cut(vector& wood, int K) {
int l = 1;
int r = 0;
for (int len : wood) r = max(r, len);
while (l < r) {
int mid = l + (r - l) / 2;
if (check(wood, K, mid))
________________; // 在此处填入代码
else l = mid + 1;
}
return l;
}

A. r = mid + 1
B. r = mid
C. l = mid
D. r = mid - 1
第20题 中级 2分 判断
数组的存储空间在物理上通常是连续的,而链表的结点可以存储在不连续的内存空间中。
T. 正确
F. 错误
第21题 中级 2分 判断
对任意正整数 a、b,以下两种写法的 gcd 函数返回值完全相同。

int gcd1(int a, int b) {
return b ? gcd1(b, a % b) : a;
}
int gcd2(int a, int b) {
while (b) {
int t = b;
b = a % b;
a = t;
}
return a;
}

T. 正确
F. 错误
第22题 中级 2分 判断
分治法通常将一个规模较大的问题拆分为若干个规模较小、结构相似的子问题,分别求解后再合并子问题的结果。
T. 正确
F. 错误
第23题 中级 2分 判断
贪心算法只要每一步选择当前最优解,就一定能得到全局最优解。
T. 正确
F. 错误
第24题 中级 2分 判断
二分查找不仅可以应用于有序数组,也可以在不增加时间复杂度的情况下应用于有序的单链表,因为链表也支持 O(1) 时间内的随机访问。
T. 正确
F. 错误
第25题 中级 2分 判断
以下函数 f1 的时间复杂度比函数 f2 的更高。

void f1(int n) {
for (int i = 1; i < n; i *= 2);
}
void f2(int n) {
if (n <= 1) return;
f2(n - 1);
f2(n - 1);
}

T. 正确
F. 错误
第26题 中级 2分 判断
唯一分解定理表明,任何一个大于 1 的自然数都可以唯一地分解为若干个质数的乘积,如果不考虑质因数的顺序,这种分解方式是唯一的。
T. 正确
F. 错误
第27题 中级 2分 判断
归并排序和快速排序在平均情况下的时间复杂度均为 O(nlog n)。但在稳定性方面,归并排序通常是不稳定的,而快速排序是稳定的。
T. 正确
F. 错误
💬