理论卷2024年12月GESP等级认证(C++) · 五级

GESP C++ 5级 2024.12

满分 100 · 及格 60 · 时长 60 分钟 · 共 27 题 (单选15 / 判断10 / 编程题2)
试卷阅览 · 免费预览前 10 题 · 交卷后可查看答案与解析
1
单选题号 #11862
分值 2

下面关于链表和数组的描述,错误的是( )。

A

当数据数量不确定时,为了应对各种可能的情况,需要申请一个较大的数组,可能浪费空间;此时用链表比较合适,大小可动态调整。

B

在链表中访问节点的效率较低,时间复杂度为 O(n)O(n)。

C

链表插入和删除元素效率较低,时间复杂度为 O(n)O(n)。

D

链表的节点在内存中是分散存储的,通过指针连在一起。

2
单选题号 #11863
分值 2

在循环单链表中,节点的 next 指针指向下一个节点,最后一个节点的 next 指针指向( )。

A

当前节点

B

nullptrnullptr

C

第一个节点

D

上一个节点

3
单选题号 #11864
分值 2

为了方便链表的增删操作,一些算法生成一个虚拟头节点,方便统一删除头节点和其他节点。下面代码实现了删除链表中值为 valval 的节点,横线上应填的最佳代码是( )。

struct LinkedNode {
 int val;
 LinkedNode* next;
 LinkedNode(int val) : val(val), next(nullptr) {}
};

void removeElements(LinkedNode* head, int val) {
 if (head == nullptr) {
 return;
 }
 LinkedNode* cur;
 LinkedNode* dummyHead = new LinkedNode(0); //虚拟头节点
 _________________// 在此处填入代码
 while (cur->next!= nullptr) {
 if (cur->next->val == val) {
 LinkedNode* tmp = cur->next;
 cur->next = cur->next->next;
 delete tmp;
 tmp = nullptr;
 } else { 
 cur = cur->next;
 }
 }
 head = dummyHead->next;
 delete dummyHead;
 dummyHead = nullptr;
}
A

dummyHead->next = head; cur = dummyHead;

B

dummyHead->next = head->next; cur = dummyHead;

C

dummyHead->next = head; cur = dummyHead->next;

D

dummyHead->next = head->next; cur = dummyHead->next;

4
单选题号 #11865
分值 2

对下面两个函数,说法错误的是( )。

int fibA(int n) {
 if (n <= 1) return n;
 int f1 = 0, f2 = 1;
 for (int i = 2; i <= n; ++i) {
 int temp = f2;
 f2 = f1 + f2;
 f1 = temp;
 }
 return f2;
}

int fibB(int n) {
 if (n <= 1) return n;
 return fibB(n - 1) + fibB(n - 2);
}
A

两个函数的实现的功能相同

B

fibA 采用递推方式。

C

fibB 采用的是递归方式。

D

fibA 时间复杂度为 O(n)O(n),fibB 的时间复杂度为 O(n2)O(n ^ 2)。

5
单选题号 #11866
分值 2

两块长方形土地的长宽分别为 2424 和 3636 米,要将它们分成正方形的小块,使得正方形的尺寸尽可能大。小杨采用如下的辗转相除函数 gcd(24, 36) 来求正方形分块的边长,则函数 gcd 调用顺序为( )。

int gcd(int a, int b) {
 int big = a > b? a : b;
 int small = a < b? a : b;
 if (big % small == 0) {
 return small;
 }
 return gcd(small, big % small);
}
A

gcd(24, 36)、gcd(24, 12)、gcd(12, 0)

B

gcd(24, 36)、gcd(12, 24)、gcd(0, 12)

C

gcd(24, 36)、gcd(24, 12)

D

gcd(24, 36)、gcd(12, 24)

6
单选题号 #11867
分值 2

唯一分解定理表明,每个大于 11 的自然数可以唯一地写成若干个质数的乘积。下面函数将自然数 nn 的所有质因数找出来,横线上能填写的最佳代码是( )。

#include 
vector get_prime_factors(int n) {
 vector factors;
 if (n 2) {
 factors.push_back(n);
 }
 return factors;
}
A

for(int i = 3; i <= n; i++)

B

for(int i = 3; i * i <= n; i++)

C

for(int i = 3; i <= n; i += 2)

D

for(int i = 3; i * i <= n; i += 2)

7
单选题号 #11868
分值 2

下述代码实现素数表的埃拉托色尼(埃氏)筛法,筛选出所有小于等于 nn 的素数。

vector sieve_Eratosthenes(int n) {
 vector is_prime(n + 1, true);
 vector primes;
 for (int i = 2; i * i <= n; i++) {
 if (is_prime[i]) {
 primes.push_back(i);
 for (int j = i * i; j <= n; j += i) {
 is_prime[j] = false;
 }
 }
 }
 for (int i = sqrt(n) + 1; i <= n; i++) {
 if (is_prime[i]) {
 primes.push_back(i);
 }
 }
 return primes;
}

下面说法,正确的是()

A

代码的时间复杂度是 O(nn)O(n\sqrt{n})

B

在标记非素数时,代码从 i2i^2开始,可以减少重复标记。

C

代码会输出所有小于等于 nn 的奇数。

D

调用函数 sieve_Eratosthenes(10),函数返回值的数组中包含的元素有:2,3,5,7,92, 3, 5, 7, 9。

8
单选题号 #11869
分值 2

下述代码实现素数表的线性筛法,筛选出所有小于等于 nn 的素数。下面说法正确的是( )。

vector sieve_linear(int n) {
 vector is_prime(n + 1, true);
 vector primes;
 for (int i = 2; i <= n / 2; i++) {
 if (is_prime[i])
 primes.push_back(i);
 for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
 is_prime[i * primes[j]] = false;
 if (i % primes[j] == 0)
 break;
 }
 }
 for (int i = n / 2 + 1; i <= n; i++) {
 if (is_prime[i])
 primes.push_back(i);
 }
 return primes;
}
A

线性筛的时间复杂度是 O(n)O(n)

B

每个合数会被其所有的质因子标记一次。

C

线性筛和埃拉托色尼筛的实现思路完全相同。

D

以上都不对

9
单选题号 #11870
分值 2

考虑以下 C++ 代码实现的快速排序算法:

int partition(vector& arr, int left, int right) {
 int pivot = arr[right];//基准值
 int i = left - 1;
 for (int j = left; j & arr, int left, int right) {
 if (left < right) {
 int pi = partition(arr, left, right);
 quickSort(arr, left, pi - 1);
 quickSort(arr, pi + 1, right);
 }
}

以下关于快速排序的说法,正确的是( )

A

快速排序通过递归对子问题进行求解

B

快速排序的最坏时间复杂度是 O(nlogn)O(nlogn)

C

快速排序是一个稳定的排序算法。

D

在最优情况下,快速排序的时间复杂度是 O(n)O(n)。

10
单选题号 #11871
分值 2

下面关于归并排序,描述正确的是()

A

归并排序是一个不稳定的排序算法。

B

归并排序的时间复杂度在最优、最差和平均情况下都是 O(nlogn)O(n logn)。

C

归并排序需要额外的 O(1)O(1) 空间

D

对于输入数组 {12,11,13,5,6,7}\{12, 11, 13, 5, 6, 7\},代码输出结果为:7 6 5 13 12 117\ 6\ 5\ 13\ 12\ 11。

🔒

已解锁前 10 题

第 11~27 题(共 17 题)可在考试中作答
本卷为普通试卷:注册用户每题扣 1 积分(每日登录送 30 体验积分),交卷后查看答案与解析
海小星AI平台海小星AI平台

点亮AI梦想,编程未来之星。专业的青少年AI编程教育平台。

课程方向

  • AIGC人工智能
  • Scratch图形化
  • Python编程
  • C++/NOIP竞赛

联系我们

  • 北京市西城区万博苑7号楼3层F28室
  • +86-010-83553010
  • contact@seanova.cn

© 2026 海小星AI平台|京ICP备2022032747号

隐私政策服务条款