#G5107. [GESP202503 五级] 客观题
[GESP202503 五级] 客观题
单选题
-
链表不具备的特点是( )。
{{ select(1) }}
- 可随机访问任何一个元素
- 插入、删除操作不需要移动元素
- 无需事先估计存储空间大小
- 所需存储空间与存储元素个数成正比
-
双向链表中每个结点有两个指针域 prev 和 next ,分别指向该结点的前驱及后继结点。设 p 指向链表中的一个结点,它的前驱结点和后继结点均非空。要删除结点 p ,则下述语句中错误的是 ( )。
{{ select(2) }}
-
- p->next->prev = p->next;
- p->prev->next = p->prev;
- delete p;
-
- p->prev->next = p->next;
- p->next->prev = p->prev;
- delete p;
-
- p->next->prev = p->prev;
- p->next->prev->next = p->next;
- delete p;
-
- p->prev->next = p->next;
- p->prev->next->prev = p->prev;
- delete p;
-
假设双向循环链表包含头尾哨兵结点(不存储实际内容),分别为 head 和 tail,链表中每个结点有两个指针域 prev 和 next,分别指向该结点的前驱及后继结点。下面代码实现了一个空的双向循环链表,横线上应填的最佳代码是()。
void InitLinkedList(LinkedList* list) { list->head = new ListNode<T>; list->tail = new ListNode<T>; // 在此处填入代码 }{{ select(3) }}
-
- list->head->prev = list->head;
- list->tail->prev = list->head;
-
- list->head->next = list->tail;
- list->tail->prev = list->head;
-
- list->head->next = list->tail;
- list->tail->next = list->head;
-
- list->head->next = list->tail;
- list->tail->next = nullptr;
-
用以下辗转相除法(欧几里得算法)求gcd(84,60)的步骤中,第二步计算的是( )。
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); }{{ select(4) }}
- 84和60
- 60和24
- 24和12
- 12和0
-
根据唯一分解定理,下面整数的唯一分解是正确的( )。
{{ select(5) }}
- 18 = 3 × 6
- 28 = 4 × 7
- 36 = 2 × 3 × 6
- 30 = 2 × 3 × 5
-
下述代码实现素数表的线性筛选,筛选出所有小于等于n的素数,横线上应填的最佳代码是()。
for (int j = 0; ______ ; j++) { // 在此处填入代码 is_prime[ i * primes[j] ] = false; if (i % primes[j] == 0) break; }{{ select(6) }}
- j < primes.size()
- i * primes[j] <= n
- j < primes.size() && i * primes[j] <= n
- j <= n
-
在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。
{{ select(7) }}
- 系统分配的栈空间溢出
- 系统分配的堆空间溢出
- 系统分配的队列空间溢出
- 系统分配的链表空间溢出
-
对下面两个函数,说法错误的是( )。
int factorialA(int n) { if (n <= 1) return 1; return n * factorialA(n-1); } int factorialB(int n) { if (n <= 1) return 1; int res = 1; for(int i=2; i<=n; i++) res *= i; }{{ select(8) }}
- 两个函数的实现的功能相同。
- 两个函数的时间复杂度均为 ( O(n) )。
- factorialA采用递归方式。
- factorialB采用递归方式。
-
下算法中,( )是不稳定的排序。
{{ select(9) }}
- 选择排序
- 插入排序
- 归并排序
- 冒泡排序
-
考虑以下C++代码实现的快速排序算法,将数据从小到大排序,则横线上应填的最佳代码是()。
if (arr[j] < pivot) { i++; swap(arr[i], arr[j]); }{{ select(10) }}
-
- if (arr[j] > pivot) {
- i++;
- swap(arr[i], arr[j]);
- }
-
- if (arr[j] < pivot) {
- i++;
- swap(arr[i], arr[j]);
- }
-
- if (arr[j] < pivot) {
- swap(arr[i], arr[j]);
- i++;
- }
-
- if (arr[j] == pivot) {
- i++;
- swap(arr[i], arr[j]);
- }
-
若用二分法在[1,100]内猜数,最多需要猜( )次。
{{ select(11) }}
- 100
- 10
- 7
- 5
-
下面代码实现了二分查找算法,在数组 arr 找到目标元素 target 的位置,则横线上能填写的最佳代码是( )。
int mid = left + (right - left) / 2;{{ select(12) }}
- int mid = left + (right - left) / 2;
- int mid = left;
- int mid = (left + right) / 2;
- int mid = right;
-
贪心算法的核心特征是( )。
{{ select(13) }}
- 总是选择当前最优解
- 回溯尝试所有可能
- 分阶段解决子问题
- 总能找到最优解
-
函数 int findMax(int arr[], int low, int high) 计算数组中最大元素,其中数组 arr 从索引 low 到 high,( )正确实现了分治逻辑。
if (low == high) return arr[low]; int mid = low + (high - low) / 2; int leftMax = findMax(arr, low, mid); int rightMax = findMax(arr, mid + 1, high); return (leftMax > rightMax) ? leftMax : rightMax;{{ select(14) }}
-
- if (low == high)
- return arr[low];
- int mid = (low + high) / 2;
- return arr[mid];
-
- if (low >= high)
- return arr[low];
- int mid = (low + high) / 2;
- int leftMax = findMax(arr, low, mid - 1);
- int rightMax = findMax(arr, mid, high);
- return leftMax + rightMax;
-
- if (low > high)
- return 0;
- int mid = low + (high - low) / 2;
- int leftMax = findMax(arr, low, mid);
- int rightMax = findMax(arr, mid + 1, high);
- return leftMax * rightMax;
-
- if (low == high)
- return arr[low];
- int mid = low + (high - low) / 2;
- int leftMax = findMax(arr, low, mid);
- int rightMax = findMax(arr, mid + 1, high);
- return (leftMax > rightMax) ? leftMax : rightMax;
-
小杨编写了一个如下的高精度乘法函数,则横线上应填写的代码为( )。
int temp = c[k] + carry;{{ select(15) }}
- int temp = c[k];
- int temp = c[k] + carry;
- int temp = c[k] - carry;
- int temp = c[k] * carry;
判断题
-
要删除单链表中某个结点 p' (非尾结点),但不知道头结点,可行的操作是将 p->next 的数据 据 分,将 p->next 设置为 p->next->next,然后删除 p->next。
{{ select(16) }}
- 对
- 错
-
链表存储线表时要求内存中可用存储单元地址是连续的。
{{ select(17) }}
- 对
- 错
-
线性筛相对于块拉托斯特尼筛法,每个含数只会被它的最小原因数筛去一次,因此效率更高。
{{ select(18) }}
- 对
- 错
-
贪心算法通过一步选择当前最优解,从而一定能获得全局最优解。
{{ select(19) }}
- 对
- 错
-
递归函数必须具有一个终止条件,以防止无限递归。
{{ select(20) }}
- 对
- 错
-
快速排序算法的时间复杂度与输入是否有序无关,始终稳定为 (O(n\log n))。
{{ select(21) }}
- 对
- 错
-
归并排序算法的时间复杂度与输入是否有序无关,始终稳定为 (O(n\log n))。
{{ select(22) }}
- 对
- 错
-
二分查找适用于对无序数组和有序数组的查找。
{{ select(23) }}
- 对
- 错
-
小杨有100元去超市买东西,每个商品有各自的价格,每种商品只能买1个,小杨的目标是买到最多数量的商品。小杨采用的策略是每次批价格最低的商品买,这体现了分治思想。
{{ select(24) }}
- 对
- 错
-
归并排序算法体现了分治算法,每次将大的待排序数组分成大小大致相等的两个小数组,然后分别对两个小数组进行排序,最后对排好序的两个小数组合并成有序数组。
{{ select(25) }}
- 对
- 错