2025年3月GESP认证C++5级判断题真题详解

第1题:√
解析:单链表每个结点存储的是当前结点的值和下一节点的地址。
而想要删去链表中间的某个结点,那就需要将前一结点与后一结点“握手”,如果是双链表,实现起来会非常容易。
但由于是单链表,我们改不了前一结点的指针,因此只能把自己“假装”成后一结点,即将p的值设置为p->next的值,然后将p->next链接到p->next->next上,跳过了真正的后一结点,从而实现p节点“被删除”的效果。

第2题:×
解析:链表存储数据的最大特点就是节点的存储地址是不连续的,节点间通过指针连接。
尽管实际代码实现中我们会用数组来模拟链表,但是要知道链表是不要求存储地址是连续的。
第3题:√
解析:本题需要考生能深入理解埃氏筛和线性筛两种筛质数的算法。
埃氏筛的核心思想是,先假设所有的数都是质数,然后从小到大开始,将所有质数的倍数都标记为非质数。
在埃氏筛的过程中,一些数字可能会被反复标记,例如30,会在2的倍数、3的倍数和5的倍数时被重复标记3次,效率不是很高。
而线性筛就是为了解决这个情况进行的算法优化:让每个合数只被自己的最小质因子“淘汰”一次,达到不被重复筛选的目的。
因此线性筛的时间复杂度更优。埃氏筛的时间复杂度为O(nlognlogn),线性筛的时间复杂度为O(n)。
第4题:×
解析:贪心算法确实是都在每一步选择当前最优解,但是最终能否计算出全局最优解,还需要针对当前情境进行验证,并不一定是全局最优解。
第5题:√
解析:递归是直接或间接调用函数自身从而求解问题的方法,而设计递归函数时,必须设计递归的终止条件,否则会出现无限递归。
无限递归是什么情况呢?每次递归调用函数都会占用栈内存,如果无限递归,最终会导致栈内存溢出而程序崩溃。
第6题:×
解析:快速排序的平均时间复杂度为O(nlogn),最佳时间复杂度也是O(nlogn),而最坏的时间复杂度为O(n^2)。
快速排序遇到的最坏情况有2种:
(1)原始数据是有序的;
(2)每次选择的基准值只能将数据移到一边,另一边是空的。
第7题:√
解析:归并排序不管是最坏情况还是最佳情况,时间复杂度都为O(nlogn)。
因为不管输入的是什么情况的数据,归并排序对数组的拆分和合并流程是固定的,与数据无关。
第8题:×
解析:二分查找的基本原理是每次将区间分为两半来逐步减小查找范围,这就要求数组是有序的,从而便于找到目标数据在哪个半区。
而无序的数组,我们没办法确定目标元素在哪个半区,因此除非先排序,否则无法使用二分查找来搜索元素。
第9题:×
解析:分治思想是将问题分解成若干个子问题,递归或直接求解子问题后,再将子问题的解整合为原问题的解,例如第6、7题的快速排序和归并排序。
而题目的描述显然与分治算法无关,其思想是贪心算法,相对应的描述为“每次挑价格最低的商品买”,对应贪心算法就是在每一步选择当前最优解。
第10题:√
解析:题干中对归并排序的描述非常标准,读者们可以结合这个描述去理解归并排序,因此正确。

posted @ 2025-04-16 16:41  gdyyx  阅读(133)  评论(0)    收藏  举报