林老师 · 客观题题库 · GESP 五级 · 2025 真题

GESP 五级 · 2025 真题

五级 · 2025 真题 · 客观题 · 每题 2 分
真题
复刻
试卷编号OBJ-780294
题目总数25 题 · 50 分
试卷类型客观题
考生须知:
① 本卷为客观题单卷,合计 25 题 · 50 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 50 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

客 观 题

25 QUESTIONS · 2 POINTS EACH
第 1 题 单选 未作答

与数组相比,链表在( )操作上通常具有更高的效率。

(2 分)
GESP 五级 2025-06 · 单选 第1题 | 知识点 单向链表、一维数组
第 2 题 单选 未作答

下面 C++ 代码实现双向链表。函数 is_empty() 判断链表是否为空,如果链表为空返回 true,否则返回 false。横线处不能填写( )。

01// 节点结构体
02struct Node {
03    int data;
04    Node* prev;
05    Node* next;
06};
07
08// 双向链表结构体
09struct DoubleLink {
10    Node* head;
11    Node* tail;
12    int size;
13
14    DoubleLink() {
15        head = nullptr;
16        tail = nullptr;
17        size = 0;
18    }
19
20    ~DoubleLink() {
21        Node* curr = head;
22        while (curr) {
23            Node* next = curr->next;
24            delete curr;
25            curr = next;
26        }
27    }
28
29    // 判断链表是否为空
30    bool is_empty() const {
31        ____________
32    }
33};

(2 分)
GESP 五级 2025-06 · 单选 第2题 | 知识点 双向链表、程序补全
第 3 题 单选 未作答

在双向链表尾部增加新节点的 append() 函数中,横线上应填写( )。

01void append(int data) {
02    Node* newNode = new Node(data, nullptr, nullptr);
03
04    if (is_empty()) {
05        head = tail = newNode;
06    } else {
07        ____________
08    }
09    ++size;
10}

(2 分)
GESP 五级 2025-06 · 单选 第3题 | 知识点 双向链表、程序补全
第 4 题 单选 未作答

下列 C++ 代码用循环链表解决约瑟夫问题,即假设 nn 个人围成一圈,从第一个人开始数,每次数到第 kk 个的人就出圈,输出最后留下的那个人的编号。横线上应填写( )。

01struct Node {
02    int data;
03    Node* next;
04};
05
06Node* createCircularList(int n) {
07    Node* head = new Node(1, nullptr);
08    Node* prev = head;
09    for (int i = 2; i <= n; ++i) {
10        Node* node = new Node(i, nullptr);
11        prev->next = node;
12        prev = node;
13    }
14    prev->next = head;
15    return head;
16}
17
18int fingLastSurvival(int n, int k) {
19    Node* head = createCircularList(n);
20    Node* p = head;
21    Node* prev = nullptr;
22
23    while (p->next != p) {
24        for (int count = 1; count < k; ++count) {
25            prev = p;
26            p = p->next;
27        }
28        ____________
29    }
30
31    cout << "最后留下的人编号是:" << p->data << endl;
32    delete p;
33
34    return 0;
35}

(2 分)
GESP 五级 2025-06 · 单选 第4题 | 知识点 循环链表、程序补全
第 5 题 单选 未作答

下列 C++ 代码判断一个正整数是否是质数,说法正确的是( )。

01bool is_prime(int n) {
02    if (n <= 1)
03        return false;
04    if (n == 2 || n == 3 || n == 5)
05        return true;
06    if (n % 2 == 0 || n % 3 == 0 || n % 5 == 0)
07        return false;
08
09    int i = 7;
10    int step = 4;
11    int finish_number = sqrt(n) + 1;
12
13    while (i <= finish_number) {
14        if (n % i == 0)
15            return false;
16        i += step;
17        step = 6 - step;
18    }
19    return true;
20}

(2 分)
GESP 五级 2025-06 · 单选 第5题 | 知识点 质数判定、时间复杂度
第 6 题 单选 未作答

下列 C++ 代码用两种方式求解两个正整数的最大公约数,说法错误的是( )。

01int gcd0(int big, int small) {
02    if (big < small) {
03        swap(big, small);
04    }
05    if (big % small == 0) {
06        return small;
07    }
08    return gcd0(small, big % small);
09}
10
11int gcd1(int big, int small) {
12    if (big < small) {
13        swap(big, small);
14    }
15    for (int i = small; i >= 1; --i) {
16        if (big % i == 0 && small % i == 0)
17            return i;
18    }
19    return 1;
20}

(2 分)
GESP 五级 2025-06 · 单选 第6题 | 知识点 最大公约数、时间复杂度、程序阅读与输出推断
第 7 题 单选 未作答

下面的代码用于判断整数 nn 是否是质数,错误的说法是( )。

01bool is_prime(int n) {
02    if (n <= 1) return false;
03
04    int finish_number = static_cast<int>(sqrt(n)) + 1;
05    for (int i = 2; i < finish_number; ++i) {
06        if (n % i == 0)
07            return false;
08    }
09    return true;
10}

(2 分)
GESP 五级 2025-06 · 单选 第7题 | 知识点 质数判定、埃氏筛、欧拉筛
第 8 题 单选 未作答

唯一分解定理描述了关于正整数的什么性质?

(2 分)
GESP 五级 2025-06 · 单选 第8题 | 知识点 质因数分解
第 9 题 单选 未作答

下面的 C++ 代码,用于求一系数据中的最大值。有关其算法说法错误的是( )。

01int find_max_recursive(const vector<int>& nums, int left, int right) {
02    if (left == right)
03        return nums[left];
04
05    int mid = left + (right - left) / 2;
06    int left_max = find_max_recursive(nums, left, mid);
07    int right_max = find_max_recursive(nums, mid + 1, right);
08
09    return max(left_max, right_max);
10}
11
12int find_max(const vector<int>& nums) {
13    if (nums.empty()) {
14        throw invalid_argument("输入数组不能为空");
15    }
16    return find_max_recursive(nums, 0, nums.size() - 1);
17}

(2 分)
GESP 五级 2025-06 · 单选 第9题 | 知识点 分治、递归
第 10 题 单选 未作答

下面的 C++ 代码,用于求一系数据中的最大值。有关其算法说法错误的是( )。

01int find_max(const vector<int>& nums) {
02    if (nums.empty()) {
03        throw invalid_argument("输入数组不能为空");
04    }
05
06    int max_value = nums[0];
07    for (int num : nums) {
08        if (num > max_value) {
09            max_value = num;
10        }
11    }
12    return max_value;
13}

(2 分)
GESP 五级 2025-06 · 单选 第10题 | 知识点 递推、空间复杂度
第 11 题 单选 未作答

下面的 C++ 代码用于在升序数组 lst 中查找目标值 target 最后一次出现的位置。相关说法,正确的是( )。

01int binary_search_last_occurrence(const vector<int>& lst, int target) {
02    if (lst.empty()) return -1;
03
04    int low = 0, high = lst.size() - 1;
05
06    while (low < high) {
07        int mid = (low + high + 1) / 2;
08        if (lst[mid] <= target) {
09            low = mid;
10        } else {
11            high = mid - 1;
12        }
13    }
14
15    if (lst[low] == target)
16        return low;
17    else
18        return -1;
19}

(2 分)
GESP 五级 2025-06 · 单选 第11题 | 知识点 二分查找、程序阅读与输出推断
第 12 题 单选 未作答

有关下面 C++ 代码的说法,错误的是( )。

01double sqrt_binary(long long n, double epsilon = 1e-10) {
02    if (n < 0) {
03        throw invalid_argument("输入必须为非负整数");
04    }
05
06    if (n == 0 || n == 1) return n;
07
08    // 阶段 1
09    long long low = 1, high = n;
10    long long k = 0;
11
12    while (low <= high) {
13        long long mid = (low + high) / 2;
14        long long mid_sq = mid * mid;
15
16        if (mid_sq == n) {
17            return mid;
18        } else if (mid_sq < n) {
19            k = mid;
20            low = mid + 1;
21        } else {
22            high = mid - 1;
23        }
24    }
25
26    long long next_k = k + 1;
27    if (next_k * next_k == n) {
28        return next_k;
29    }
30
31    // 阶段 2
32    double low_d = (double)k;
33    double high_d = (double)(k + 1);
34    double mid;
35
36    while (high_d - low_d >= epsilon) {
37        mid = (low_d + high_d) / 2;
38        double mid_sq = mid * mid;
39
40        if (mid_sq < n) {
41            low_d = mid;
42        } else {
43            high_d = mid;
44        }
45    }
46
47    double result = (low_d + high_d) / 2;
48    long long check_int = (long long)(result + 0.5);
49    if (check_int * check_int == n) {
50        return check_int;
51    }
52
53    return result;
54}

(2 分)
GESP 五级 2025-06 · 单选 第12题 | 知识点 二分查找、二分答案、程序阅读与输出推断
第 13 题 单选 未作答

硬币找零问题中要求找给客户最少的硬币。coins 存储可用硬币规格,单位为角,假设规格都小于 1010 角,且一定有 11 角规格。amount 为要找零的金额,约定必须为 11 角的整数倍。输出为每种规格及其数量,按规格从大到小输出,如果某种规格不必要,则输出为 00。下面是其实现代码,相关说法正确的是( )。

01const int MAX_COINS = 10;
02int result[MAX_COINS] = {0};  // 假设最多10种面额
03
04int find_coins(const vector<int>& coins, int amount) {
05    sort(coins.begin(), coins.end(), greater<int>());
06
07    int n = coins.size();
08
09    for (int i = 0; i < n; ++i) {
10        int coin = coins[i];
11        int num = amount / coin;
12        result[i] = num;
13        amount -= num * coin;
14        if (amount == 0) break;
15    }
16
17    cout << "找零方案如下:" << endl;
18    for (int i = 0; i < n; ++i) {
19        cout << sorted_coins[i] << "角需要" << result[i] << "枚" << endl;
20    }
21
22    return 0;
23}

(2 分)
GESP 五级 2025-06 · 单选 第13题 | 知识点 贪心、程序阅读与输出推断
第 14 题 单选 未作答

关于下述 C++ 代码的快速排序算法,说法错误的是( )。

01int randomPartition(std::vector<int>& arr, int low, int high) {
02    int random = low + rand() % (high - low + 1);
03    std::swap(arr[random], arr[high]);
04
05    int pivot = arr[high];
06    int i = low - 1;
07
08    for (int j = low; j < high; j++) {
09        if (arr[j] <= pivot) {
10            i++;
11            std::swap(arr[i], arr[j]);
12        }
13    }
14    std::swap(arr[i + 1], arr[high]);
15    return i + 1;
16}
17
18void quickSort(std::vector<int>& arr, int low, int high) {
19    if (low < high) {
20        int pi = randomPartition(arr, low, high);
21
22        quickSort(arr, low, pi - 1);
23        quickSort(arr, pi + 1, high);
24    }
25}

(2 分)
GESP 五级 2025-06 · 单选 第14题 | 知识点 快速排序、排序稳定性、程序阅读与输出推断
第 15 题 单选 未作答

小杨编写了一个如下的高精度除法函数,则横线上应填写的代码为( )。

01const int MAXN = 1005; // 最大位数
02struct BigInt {
03    int d[MAXN]; // 存储数字,d[0]是个位,d[1]是十位,...
04    int len;     // 数字长度
05
06    BigInt() {
07        memset(d, 0, sizeof(d));
08        len = 0;
09    }
10};
11
12// 比较两个高精度数的大小
13int compare(BigInt a, BigInt b) {
14    if(a.len != b.len) return a.len > b.len ? 1 : -1;
15    for(int i = a.len - 1; i >= 0; i--) {
16        if(a.d[i] != b.d[i]) return a.d[i] > b.d[i] ? 1 : -1;
17    }
18    return 0;
19}
20
21// 高精度减法
22BigInt sub(BigInt a, BigInt b) {
23    BigInt c;
24    for(int i = 0; i < a.len; i++) {
25        c.d[i] += a.d[i] - b.d[i];
26        if(c.d[i] < 0) {
27            c.d[i] += 10;
28            c.d[i+1]--;
29        }
30    }
31    c.len = a.len;
32    while(c.len > 1 && c.d[c.len-1] == 0) c.len--;
33    return c;
34}
35
36// 高精度除法 (a/b, 返回商和余数)
37pair<BigInt, BigInt> div(BigInt a, BigInt b) {
38    BigInt q, r; // q是商,r是余数
39
40    if(compare(a, b) < 0) { // 如果a<b,商为0,余数为a
41        q.len = 1;
42        q.d[0] = 0;
43        r = a;
44        return make_pair(q, r);
45    }
46
47    // 初始化余数r为a的前b.len位
48    r.len = b.len;
49    for(int i = a.len - 1; i >= a.len - b.len; i--) {
50        r.d[i - (a.len - b.len)] = a.d[i];
51    }
52
53    // 逐位计算商
54    for(int i = a.len - b.len; i >= 0; i--) {
55        // 把下一位加入余数
56        if(r.len > 1 || r.d[0] != 0) {
57            for(int j = r.len; j > 0; j--) {
58                r.d[j] = r.d[j-1];
59            }
60            ____________
61        } else {
62            r.d[0] = a.d[i];
63            r.len = 1;
64        }
65
66        // 计算当前位的商
67        while(compare(r, b) >= 0) {
68            r = sub(r, b);
69            q.d[i]++;
70        }
71    }
72
73    // 确定商的长度
74    q.len = a.len - b.len + 1;
75    while(q.len > 1 && q.d[q.len-1] == 0) q.len--;
76
77    // 处理余数前导零
78    while(r.len > 1 && r.d[r.len-1] == 0) r.len--;
79
80    return make_pair(q, r);
81}

(2 分)
GESP 五级 2025-06 · 单选 第15题 | 知识点 高精度、程序补全
第 16 题 判断 未作答

下面 C++ 代码是用欧几里得算法(辗转相除法)求两个正整数的最大公约数,a 大于 b 还是小于 b 都适用。

01int gcd(int a, int b) {
02    while (b) {
03        int temp = b;
04        b = a % b;
05        a = temp;
06    }
07    return a;
08}

(2 分)
GESP 五级 2025-06 · 判断 第1题 | 知识点 最大公约数、程序阅读与输出推断
第 17 题 判断 未作答

假设函数 gcd() 函数能正确求两个正整数的最大公约数,则下面的 lcm() 函数能求相应两数的最小公倍数。

01int lcm(int a, int b) {
02    return a * b / gcd(a, b);
03}

(2 分)
GESP 五级 2025-06 · 判断 第2题 | 知识点 最小公倍数、最大公约数、程序阅读与输出推断
第 18 题 判断 未作答

下面的 C++ 代码用于输出每个数对应的质因数表,输出形如:{5: [5], 6: [2, 3], 7: [7], 8: [2, 2, 2]}

01int main() {
02    int n, m;
03    cin >> n >> m;
04    if (n > m) swap(n, m);
05
06    map<int, vector<int>> prime_factor;
07
08    for (int i = n; i <= m; ++i) {
09        int j = 2, k = i;
10        while (k != 1) {
11            if (k % j == 0) {
12                prime_factor[i] = prime_factor[i] + j;
13                k /= j;
14            } else {
15                ++j;
16            }
17        }
18    }
19
20    for (auto& p : prime_factor) {
21        cout << p.first << ": ";
22        for (int v : p.second)
23            cout << v << " ";
24        cout << endl;
25    }
26
27    return 0;
28}

(2 分)
GESP 五级 2025-06 · 判断 第3题 | 知识点 质因数分解、程序阅读与输出推断
第 19 题 判断 未作答

下面的 C++ 代码实现归并排序。代码在执行时,将输出一次 HERE 字符串,因为 merge() 函数仅被调用一次。

01void merge(std::vector<int>& arr, int left, int mid, int right) {
02    std::vector<int> temp(right - left + 1);
03
04    int i = left;
05    int j = mid + 1;
06    int k = 0;
07
08    while (i <= mid && j <= right) {
09        if (arr[i] <= arr[j]) {
10            temp[k++] = arr[i++];
11        } else {
12            temp[k++] = arr[j++];
13        }
14    }
15
16    while (i <= mid) {
17        temp[k++] = arr[i++];
18    }
19
20    while (j <= right) {
21        temp[k++] = arr[j++];
22    }
23
24    for (int p = 0; p < k; ++p) {
25        arr[left + p] = temp[p];
26    }
27}
28
29void mergeSort(std::vector<int>& arr, int left, int right) {
30    if (left >= right) {
31        return;
32    }
33
34    int mid = left + (right - left) / 2;
35
36    mergeSort(arr, left, mid);
37    mergeSort(arr, mid + 1, right);
38
39    std::cout << "HERE";
40    merge(arr, left, mid, right);
41}

(2 分)
GESP 五级 2025-06 · 判断 第4题 | 知识点 归并排序、程序阅读与输出推断
第 20 题 判断 未作答

归并排序的最好、最坏和平均时间复杂度均为 O(nlogn)O(n \log n)

(2 分)
GESP 五级 2025-06 · 判断 第5题 | 知识点 归并排序、排序复杂度
第 21 题 判断 未作答

查字典这个小学生必备技能,可以把字典视为一个已排序的数组。假设小杨要查找一个音首字母为 g 的单词,他首先翻到字典约一半的页数,发现该页的首字母是 m ,由于字母表中 g 位于 m 之前,所以排除字典后半部分,查找范围缩小到前半部分;不断重复上述步骤,直至找到首字母为 g 的页码。这种查字典的一系列操作可看作二分查找。

(2 分)
GESP 五级 2025-06 · 判断 第6题 | 知识点 二分查找
第 22 题 判断 未作答

求解下图中 AA 点到 DD 点最短路径,其中 AABB 之间的 1212 可以理解为距离。求解这样的问题常用 Dijkstra 算法,其思路是通过逐步选择当前距离起点最近的节点来求解非负权重图(如距离不能为负值)单源最短路径的算法。从该算法的描述可以看出,Dijkstra 算法是贪心算法。

(2 分)
GESP 五级 2025-06 · 判断 第7题 | 知识点 Dijkstra、贪心
第 23 题 判断 未作答

分治算法将原问题可以分解成规模更小的子问题,使得解决问题的难度降低。但由于分治算法需要将问题进行分解,并且需要将多个子问题的解合并为原问题的解,所以分治算法的效率通常比直接求解原问题的效率低。

(2 分)
GESP 五级 2025-06 · 判断 第8题 | 知识点 分治
第 24 题 判断 未作答

函数 puzzle 定义如下,则调用 puzzle(7) 程序会无限递归。

01int puzzle(int n) {
02    if (n == 1) return 1;
03    if (n % 2 == 0) return puzzle(n / 2);
04    return puzzle(3 * n + 1);
05}

(2 分)
GESP 五级 2025-06 · 判断 第9题 | 知识点 递归、程序阅读与输出推断
第 25 题 判断 未作答

如下为线性筛法,用于高效生成素数表,其核心思想是每个合数只被它的最小质因数筛掉一次,时间复杂度为 O(n)O(n)

01vector<int> linearSieve(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04
05    for (int i = 2; i <= n; ++i) {
06        if (is_prime[i]) {
07            primes.push_back(i);
08        }
09
10        for (int j = 0; j < primes.size() && i * primes[j] <= n; ++j) {
11            is_prime[i * primes[j]] = false;
12            if (i % primes[j] == 0) {
13                break;
14            }
15        }
16    }
17    return primes;
18}

(2 分)
GESP 五级 2025-06 · 判断 第10题 | 知识点 欧拉筛、时间复杂度