#1861. GESP五级202506-选择判断

GESP五级202506-选择判断

1 单选题(每题 2 分,共 30 分)

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

  • 随机访问元素
  • 查找指定元素
  • 在已知位置插入或删除节点
  • 遍历所有元素

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

image

{{ select(2) }}

  • return head == nullptr;
  • return tail == nullptr;
  • return head.data == 0;
  • return size == 0;

第 3 题 基于上题代码正确的前提下,填入相应代码完善 append() ,用于在双向链表尾部增加新节点,横线上应填写( )。

image

{{ select(3) }}

  • image
  • image
  • image
  • image

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

image

{{ select(4) }}

  • image
  • image
  • image
  • image

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

image

{{ select(5) }}

  • 代码存在错误,比如5是质数,但因为 5 % 5 余数是0返回了 false
  • finish_number 的值应该是 n / 2 ,当前写法将导致错误
  • 当前 while 循环正确的前提是:所有大于3的质数都符合 6k±1 形式
  • while 循环修改如下,其执行效果和执行时间相同。 image

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

image

{{ select(6) }}

  • gcd0() 函数的时间复杂度为O(logn)O(logn)
  • gcd1() 函数的时间复杂度为O(n)O(n)
  • 一般说来, gcd0() 的效率高于 gcd1()
  • gcd1() 中的代码 for (int i = small; i >= 1; --i) 应该修改为 for (int i = small; i > 1; --i)

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

image

{{ select(7) }}

  • 埃氏筛算法相对于上面的代码效率更高
  • 线性筛算法相对于上面的代码效率更高
  • 上面的代码有很多重复计算,因为不是判断单个数是否为质数,故而导致筛选出连续数中质数的效率不高
  • 相对而言,埃氏筛算法比上面代码以及线性筛算法效率都高

第 8 题 唯一分解定理描述了关于正整数的什么性质? {{ select(8) }}

  • 任何正整数都可以表示为两个素数的和。
  • 任何大于1的合数都可以唯一分解为有限个质数的乘积。
  • 两个正整数的最大公约数总是等于它们的最小公倍数除以它们的乘积。
  • 所有素数都是奇数。

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

image

{{ select(9) }}

  • 该算法采用分治算法
  • 该算法是递归实现
  • 该算法采用贪心算法
  • 该算法不是递推算法

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

image

{{ select(10) }}

  • 本题 find_max() 函数采用的是迭代算法
  • 本题 find_max() 函数的时间复杂度为O(n)O(n)
  • 和上一题的 find_max() 相比,因为没有递归,所以没有栈的创建和销毁开销
  • 本题 find_max() 函数和上一题的 find_max() 时间复杂度相同

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

image {{ select(11) }}

  • 当 lst 中存在重复的 target 时,该函数总能返回最后一个 target 的位置,即便 lst 全由相同元素组成
  • 当 target 小于 lst 中所有元素时,该函数会返回 0
  • 循环条件改为 while (low <= high) 程序执行效果相同,且能提高准确性
  • 将代码中 (low + high + 1) / 2 修改为 (low + high) / 2 效果相同

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

image

{{ select(12) }}

  • “阶段1”的目标是寻找正整数 n 可能的正完全平方根
  • “阶段2”的目标是如果正整数 n 没有正完全平方根,则在可能产生完全平方根附近寻找带小数点的平方根
  • 代码 check_int = (long long)(result + 0.5) 是检查因浮点误差是否为正完全平方根
  • 阶段2的二分法中 high_d - low_d >= epsilon 不能用于浮点数比较,会进入死循环

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

image

{{ select(13) }}

  • 上述代码采用贪心算法实现
  • 针对本题具体要求,上述代码总能找到最优解
  • 上述代码采用枚举算法
  • 上述代码采用分治算法

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

image

{{ select(14) }}

  • 在 randomPartition 函数中,变量 i 的作用是记录大于基准值的元素的边界
  • randomPartition 函数随机选择基准值,可以避免输入数据特定模式导致的最坏情况下时间复杂度O(n2)O(n^2)
  • 快速排序平均时间复杂度是O(nlogn)O(n logn)
  • 快速排序是稳定排序算法

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

image

{{ select(15) }}

  • image
  • image
  • image
  • image

2 判断题(每题 2 分,共 20 分)

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

image

{{ select(16) }}

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

image

{{ select(17) }}

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

image

{{ select(18) }}

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

image

{{ select(19) }}

第 5 题 归并排序的最好、最坏和平均时间复杂度均为O(nlogn)O(nlogn)。 {{ select(20) }}

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

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

image

{{ select(22) }}

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

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

image

{{ select(24) }}

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

image

{{ select(25) }}