下列关于排序的说法,正确的是( )。
B:快排通常不稳定(基准交换会打乱相等元素相对顺序);冒泡是 O(n²) 并非最快,归并最差为 O(n log n) 而非 O(N),故选 B。
下面的程序属于哪种算法( )。
01int pos[8]; 02void queen(int n) { 03 for (int i = 0; i < 8; i++) { 04 pos[n] = i; 05 bool attacked = false; 06 for (int j = 0; j < n; j++) 07 if (pos[n] == pos[j] || pos[n] + n == pos[j] + j || pos[n] - n == pos[j] - j) { 08 attacked = true; 09 break; 10 } 11 if (attacked) 12 continue; 13 if (n == 7) { 14 return; 15 } else { 16 queen(n + 1); 17 } 18 } 19}
C:queen 逐行尝试放子,冲突则 continue,否则递归下一行并回溯换列,是典型的深度优先搜索(回溯法)实现八皇后。故选 C。
下面有关 C++ 类的说法,错误的是( )。
D:类的成员变量类型受限——不能包含自身类型的非静态成员、引用成员必须在初始化列表初始化等,并非任意类型;A、B、C 均正确,故选 D。
一个连通的简单无向图,共有 条边,则该图至少有( )个顶点。
C:K₈ 恰有 C(8,2)=28 条边;7 个顶点的连通无向图最多 C(7,2)=21 条边,故 28 条边的连通图至少需要 8 个顶点。
以下哪个方案不能合理解决或缓解哈希表冲突( )。
D:用新元素覆盖冲突表项会直接丢失旧数据,不能算解决冲突;单链表链地址、额外冲突链表、二次哈希等方案都能合理缓解冲突;数据一旦被覆盖就无法恢复。
已知一颗二叉树的中序遍历序列为:{C F B A E D G},后序遍历序列为:{F C B E G D A},则下列说法中正确的是( )。
B:后序末尾 A 为根,中序 CFBAEDG 分左右:左子树 B(C(F))、右子树 D(E,G),最深 4 层故高为 4;叶只有 F、E、G 三个。
以下关于二叉排序树的说法,正确的是( )。
A:二叉排序树中序遍历必为升序;最坏情况退化成链查找为 O(n) 而非 O(log n),且不一定是平衡树,故 A 正确。故选 A。
已知 x 为 double 类型的变量,且值大于 ,则下列表达式的值一定大于 的是( )。
B:e^x=1+x+x²/2+… 恒大于 x,故 exp(x)−x>0;sin(x)/x 可能为负,log(x)−x、x²−x 在部分区间也小于 0。
一个简单有向图有 个结点、 条边。再增加多少条边可以成为完全图。( )
A:10 个结点的简单有向完全图每个顶点指向其余 9 个,共 10×9=90 条边;当前只有 30 条,还需补 60 条。故 A 正确。
下列选项中,哪个可能是下图的深度优先遍历序列( )。
C:按图模拟 DFS:从 8 出发先访 10,深入 12、9、11 后回溯,再走 4、5、3、2、1、6、7;A 中 10 后不能接 7,B 中 3 后不能接 12,D 中 10 后不能接 9。
下面 schedule 函数的时间复杂度为( )。
01#include <algorithm> 02using namespace std; 03struct activity { 04 int id, start, end; 05}; 06bool compare(activity a, activity b) { 07 return a.end < b.end; 08} 09int schedule(int n, activity * p) { 10 sort(p, p + n, compare); 11 int cnt = 0, end = 0; 12 for (int i = 0; i < n; i++) { 13 if (p[i].start >= end) { 14 end = p[i].end; 15 cnt++; 16 } 17 } 18 return cnt; 19}
C:schedule 先 sort(p,p+n) 按结束时间排序耗时 O(n log n),再单趟贪心挑选活动 O(n),总时间复杂度 O(n log n)。
下面 search 函数的平均时间复杂度为( )。
01int search(int n, int * p, int target) { 02 int low = 0, high = n; 03 while (low <= high) { 04 int middle = (low + high) / 2; 05 if (target == p[middle]) { 06 return middle; 07 } else if (target > p[middle]) { 08 low = middle + 1; 09 } else { 10 high = middle - 1; 11 } 12 } 13 return -1; 14}
B:search 是二分查找,每轮把搜索区间减半,最多 log₂n 次迭代,故平均与最坏时间复杂度均为 O(log n)。故选 B。
下面 count_triple 函数的时间复杂度为( )。
01int count_triple(int n) { 02 int cnt = 0; 03 for (int a = 1; a <= n; a++) 04 for (int b = a; a + b <= n; b++) 05 for (int c = b; a + b + c <= n; c++) 06 if (a * a + b * b == c * c) 07 cnt++; 08 return cnt; 09}
C:count_triple 中 a、b、c 三层 for 循环上界均不超过 n,循环体执行次数为 O(n³),因此时间复杂度为 O(n³)。
下面程序的输出为( )。
01#include <iostream> 02using namespace std; 03int down(int n) { 04 if (n <= 1) 05 return n; 06 return down(n - 1) + down(n - 2) + down(n - 3); 07} 08int main() { 09 cout << down(6) << endl; 10 return 0; 11}
A:down(0)=0、down(1)=1;down(2)=down(1)+down(0)+down(−1)=0,down(3)=1,down(4)=2,down(5)=3,故 down(6)=3+2+1=6。
下面的程序使用邻接矩阵表达的带权无向图,则从顶点 到顶点 的最短距离为( )。
01int weight[4][4] = { 02 {0, 2, 5, 8}, 03 {2, 0, 1, 7}, 04 {5, 1, 0, 4}, 05 {8, 7, 4, 0}};
B:0→1→2→3 的路径距离为 2+1+4=7;直接边 0→3 为 8,0→2→3 为 9,0→1→3 为 9,均更大,最短距离为 7。
祖冲之是南北朝时期杰出的数学家、天文学家,其主要贡献在数学、天文历法和机械制造三方面。他首次将“圆周率”精算到小数第七位,即在 和 之间。( )
对。祖冲之首次把圆周率精确到小数点后第七位,即介于 3.1415926 和 3.1415927 之间,比欧洲早一千多年,说法正确,史实正确。
C++ 语言中,表达式 2 ^ 3 的结果类型为 int,值为 。( )
错。^ 是按位异或而非乘方:2^3 即 010₂ XOR 011₂ = 001₂ = 1,不是 8;求乘方需用 pow 函数,故错。
一棵有 N 个节点的完全二叉树,则树的深度为 。( )
对。N 个结点的完全二叉树深度为 ⌊log₂N⌋+1:如 N=1 深度 1、N=4 深度 3,符合逐层从左到右排满的性质。故公式正确。
能用动态规划解决的问题,一般也可以用贪心法解决,但动态规划的效率更高。( )
错。贪心仅在满足贪心选择性质的问题上适用,很多能用 DP 的问题(如背包)贪心会出错;且 DP 效率也不一定比贪心低;如 0/1 背包贪心只能取单位价值最优。
使用 math.h 或 cmath 头文件中的正弦函数,表达式 sin(30) 的结果类型为 double、值约为 。( )
错。sin 的参数单位是弧度而非角度,sin(30) 求的是 30 弧度的正弦,值约 −0.988,不是 sin30°=0.5,故错。
要求出简单有向图中从顶点 A 到顶点 B 的最短路径,在深度优先搜索和广度优先搜索中选择,广度优先更适合。( )
对。无权图最短路径按层扩散,BFS 从 A 出发第一次访问到 B 时的层数就是最少边数;DFS 可能绕远,故 BFS 更适合,故正确。
某 N 个表项的哈希表,在发生哈希函数冲突时采用向后寻找空位的方法解决冲突。其查找操作的平均时间复杂度为 ,即使当该哈希表的每个表项都有元素时,查找操作的平均时间复杂度仍为 。( )
错。哈希表全部表项都被占用时,线性探测的查找需要沿探测序列向后找,平均复杂度退化为接近 O(N),不再是 O(1);哈希只能缓解冲突,不能消除冲突。
动态规划有递推实现和递归实现,有时两种实现的时间复杂度不同。( )
对。递推实现按阶段填表每个状态只算一次;无记忆化的递归会反复重算相同子问题导致指数级膨胀,二者复杂度可能不同,故说法正确。故正确,故对。
围棋游戏中,判断落下一枚棋子后是否会提掉对方的子,可以使用泛洪算法来实现。( )
对。判断提子需找出被围棋子所在连通块并统计气数,用泛洪填充(Flood Fill,BFS/DFS 扩散)遍历连通块即可实现。故正确。
类 B 继承了抽象类 A,但未实现类 A 中的纯虚函数 f,则类 B 不能直接实例化。( )
对。B 继承抽象类 A 但未实现纯虚函数 f,则 B 仍是抽象类,不能直接实例化;只有实现了全部纯虚函数后才能创建对象。故说法正确。