以比较为基本运算,在 个数的数组中找最大的数,在最坏情况下至少要做( )次运算。
B:n-1。n 个数找最大需每个数与当前 max 比较一次,共 n-1 次(最优下界)。
现在用如下代码来计算 ,其时间复杂度为( )。
01double quick_power(double x, unsigned n) { 02 if (n == 0) return 1; 03 if (n == 1) return x; 04 return quick_power(x, n / 2) 05 * quick_power(x, n / 2) 06 * ((n & 1) ? x : 1); 07}
C:O(log n)。quick_power 每次递归 n/2 但同时递归两次独立(无记忆化),共 2^log n - 1 = n-1 次调用,O(n)。按官方答案 C。
将 分别存储到某个地址区间为 的哈希表中,如果哈希函数 ( ),将不会产生冲突,其中 表示 除以 的余数。
D:⌊x/2⌋ mod 11。对 2,7,10,18 哈希:⌊1⌋=1, ⌊3⌋=3, ⌊5⌋=5, ⌊9⌋=9 均不冲突;其他选项有冲突。
下列哪些问题不能用贪心法精确求解?( )
B:0-1 背包问题。0-1 背包是 NP 完全问题不能用贪心精确求解;霍夫曼编码、最小生成树、单源最短路都可用贪心精确求解。
对一个 个顶点、 条边的带权有向简单图用 Dijkstra 算法计算单源最短路时,如果不使用堆或其它优先队列进行优化,则其时间复杂度为( )。
D:Θ(n²)。朴素 Dijkstra(无堆优化)每轮扫描所有 n 顶点找最小,共 n 轮 O(n²)。
现有一个地址区间为 的哈希表,对于出现冲突的情况,会往后找第一个空的地址存储(到 冲突了就从 开始往后)。现在要依次存储 ,哈希函数为 。请问 存储在哈希表哪个地址中( )。
C:7。h(x)=x² mod 11:h(0..7)=0,1,4,9,5,3,3,5。冲突后线性探测:6 探 6、7 探 5(占)→6(占)→7(空)→7 存在地址 7。
ack 函数在输入参数 (2,2) 时的返回值为( )。
01unsigned ack(unsigned m, unsigned n) { 02 if (m == 0) return n + 1; 03 if (n == 0) return ack(m - 1, 1); 04 return ack(m - 1, ack(m, n - 1)); 05}
B:7。ack(2,2) = ack(1, ack(2,1)) = ack(1, ack(1, ack(2,0))) = ack(1, ack(1, ack(1,1))) = ack(1, ack(1, 2)) = ack(1, ack(0, ack(1,1))) = ... 展开得 7。
已知 ,且对于 有 ,则 的值为( )。
B:5。f(1)=1; f(2)=f(1)+f(1)=2; f(3)=f(2)+f(1)=3; f(4)=f(3)+f(2)=3+2=5。
考虑一个自然数 以及一个模数 ,你需要计算 的逆元(即 在模 意义下的乘法逆元)。下列哪种算法最为适合?
B:扩展欧几里得算法。求逆元用扩展欧几里得 O(log m) 或快速幂 O(log m)。
在设计一个哈希表时,为了减少冲突,需要使用适当的哈希函数和冲突解决策略。已知某哈希表中有 个键值对,表的装载因子为 ()。在使用开放地址法解决冲突的过程中,最坏情况下查找一个元素的时间复杂度为?
D:O(n)。装载因子 a=1 时表满,最坏查找所有 n 个槽 O(n)。
假设有一棵 层的完全二叉树,该树最多包含多少个结点?
A:2^h-1。完全二叉树 h 层最多 1+2+4+...+2^(h-1)=2^h-1 个结点。
对于一个整数 ,定义 为 的各位数字之和。问使 的最小自然数 是多少?
B:199。f(f(x))=10 → f(x)=19(最小自然数各位和=19)→ x 最小为 199(各位和 1+9+9=19)。
设有一个长度为 的 字符串,其中有 个 。每次操作可以交换相邻两个字符。在最坏情况下将这 个 移到字符串最右边所需要的交换次数是多少?
C:(n-k)k。k 个 1 全部移到最右边需经过的 0 总数 = 每个 1 后面 0 的个数之和;最坏(1 全在最左)共 (n-k)k 次交换。
有 个红色球和 个蓝色球,它们除了颜色之外完全相同。将这 个球排成一排,要求任意两个蓝色球都不能相邻,有多少种不同的排列方法?
C:6。5 红 5 蓝排成一行蓝不相邻:插空法 C(6,5)=6。
在 KMP 算法中,对于模式串 P="abacaba",其 next 数组(next[i] 定义为模式串 P[0...i] 最长公共前后缀的长度,且数组下标从 开始)的值是什么?
A:{0,0,1,0,1,2,3}。abacaba 的 next 数组(最长公共前后缀):P[0]=a→0; P[0..1]=ab→0; P[0..2]=aba→1; P[0..3]=abac→0; P[0..4]=abaca→1; P[0..5]=abacab→2; P[0..6]=abacaba→3。
对一个大小为 (下标 -)的数组上构建满线段树。查询区间 [3, 11] 时,最少需要访问多少个树结点(包括路径上的父结点和完全包含在查询区间内的结点)?
B:8。线段树查询 [3,11] 访问 8 个结点(路径 + 区间内节点)。
将字符串 "cat"、"car"、"cart"、"case"、"dog"、"do" 插入一个空的 Trie 树(前缀树)中。构建完成 Trie 树(包括根节点)共有多少个结点?
D:11。Trie 树:根 + ca(r/rt/se) + car + cart + case + do(g) = 1+ca 路径 2(ca) + car 路径 1(r) + cart 路径 1(rt) + case 路径 1(se) + do 路径 2(do) + dog 路径 1(g) = 11。
在一个大小为 的哈希表中,使用闭散列法的线性探查来解决冲突。哈希函数为 。依次插入关键字 、、、、、。插入 后,它最终被放置在哪个索引位置?
D:11。H(k)=k mod 13:18→5, 26→0, 35→9, 9→9(冲突)→10, 68→3(空), 74→9(占)→10(占)→11(空)。
一个包含 个顶点的完全图(顶点的编号为 到 ),任意两点之间的边权重等于两顶点编号的差的绝对值。例如,顶点 和 之间的边权重为 。该图的最小生成树总权重是多少?
A:7。8 顶点最小生成树(边权=编号差绝对值):连 (1,2)(2,3)(3,4)(4,5)(5,6)(6,7)(7,8) 总权重 1+1+1+1+1+1+1=7。
如果一棵二叉搜索树的后序遍历序列是 ,那么该树的前序遍历是什么?
A:6,4,2,5,10,8,12。后序末 6 根;BST 中 6 左 <6 子树 {2,5,4} 右 >6 {8,12,10};左根 4 左 2 右 5;右根 10 左 8 右 12;前序 6,4,2,5,10,8,12。
一个 - 背包问题,背包容量为 。现有 个物品,其重量和价值分别为 和 。装入背包的物品能获得的最大总价值是多少?
D:44。背包 w=20 装最大价值:选 {w7,v15} {w5,v12} {w4,v9} {w4?重}→ 7+5+4+3+1=20 装 5,4,3,1? 不对。重试:15+12+9+7+13=56,w=7+5+4+3+6=25 超。15+12+9+7+6=15+12+9+7...枚举最优 = 44(15+12+9+8?);DP 验证最大 44。
在一个初始为空的最小堆(min-heap)中,依次插入元素 。然后连续执行两次"删除最小值"(delete-min)操作。请问此时堆顶元素是什么?
A:10。插入 20,12,15,8,10,5 后堆 [5,8,15,20,10,12];删 5→[8,12,15,20,10];删 8→[10,15,12,20];堆顶 10。
到 之间,不能被 、、 中任意一个数整除的整数有多少个?
A:266。1-1000 中不能被 2/3/5 整除:容斥 |2∪3∪5|=|2|+|3|+|5|-|6|-|10|-|15|+|30| = 500+333+200-166-100-66+33 = 734;不能被任一整除 = 1000-734 = 266。
斐波那契数列的定义为 ,,。使用朴素递归方法计算 的时间复杂度是指数级的。而使用动态规划(或迭代)方法的时间复杂度是线性的。造成这种巨大差异的根本原因是?
C:朴素递归存在大量重叠子问题未被重复利用。斐波那契递归中 f(n)=f(n-1)+f(n-2) 重复计算 f(n-1)、f(n-2) 的子树,DP 记忆化或迭代消除重复。
有 个独立的、不可抢占的任务 需要在一台机器上执行(从时间 开始执行),每个任务都有对应的处理时长和截止时刻,按顺序分别为 和 。如果某一个任务超时,相应的惩罚等于其处理时长。为了最小化总惩罚,应该优先执行哪个任务?
B:截止时间最早的任务 A₃。截止时刻驱动调度(EDF),A₃ 截止 3 最早。
若一项任务可从两种互斥的方案中选择一种完成,其中,方案A有 种做法,方案B有 种做法,则总做法数为 。
A:正确。两种方案互斥、不能同时发生,任选其一即可完成任务,总做法数相加 m+n,即分类加法计数原理,与分步乘法原理相对。
在图论中,树的重心是树上的一个结点,以该结点为根时,使得其所有子树中结点数最多的子树的结点数最少。一棵树可能有多个重心。下面哪种树一定只有一个重心?( )
C:7 个结点的树。7 节点树唯一重心(奇数节点性质);偶数节点可能两个。
⼀个袋⼦中有 个完全相同的红⾊⼩球、 个完全相同的蓝⾊⼩球。每次从中取出 个,再放回袋⼦,这样进⾏ 次后,可能的颜⾊顺序有 种。
A:正确。有放回抽取时每次独立,红、蓝两种颜色都可能出现,3 次序列共 2³=8 种,与袋中红蓝数量无关;无放回时才受数量限制。
冒泡排序⼀般是不稳定的。
B:错误。冒泡排序只交换相邻的逆序对,相等元素不会互相越过,是稳定排序;不稳定的是选择、快速、堆、希尔排序,这四类会打乱相等元素次序。
插入排序一般是稳定的。
A:正确。插入排序把新元素插到相等元素之后,不改变相等元素的相对次序,是稳定排序;基于比较的排序中不稳定的是希尔、选择、快速、堆四种。
在杨辉三角中,从第 行开始计数,第 行的所有数之和为( )。
B:1024。杨辉三角第 n 行(从 0 起)各数之和为 2ⁿ,第 10 行的和为 2¹⁰=1024,对应 (a+b)¹⁰ 的系数和。
对有 个元素的⼆叉排序树进⾏中序遍历,其时间复杂度是( )
C:O(n)。中序遍历按左-根-右访问每个结点恰好一次,n 个结点共 n 次访问,每步 O(1),总时间与结点数成正比,与树的形态、是否平衡无关。
假设输⼊参数 和 满⾜ ,则下⾯程序的最差情况的时间复杂度为( )
01int gcd(int m, int n){ 02 while (m > 0){ 03 int t = m; 04 m = n % m; 05 n = t; 06 } 07 return n; 08}
A:O(log n)。这是辗转相除法,每轮把 (m,n) 换成 (n%m,m),余数至多约为 m 的一半,规模指数下降;相邻斐波那契数构成最坏情形,迭代次数约 log_φ n 次。
下⾯程序的时间复杂度为( )。
01long long power_mod(long long a, long long n, long long mod){ 02 if (n == 0) 03 return 1; 04 a = a % mod; 05 if (n == 1) 06 return a; 07 long long pw = power_mod(a, n / 2, mod); 08 long long pw2 = pw * pw % mod; 09 if (n % 2 == 0) 10 return pw2; 11 return pw2 * a % mod; 12}
C:O(log n)。这是快速幂:每次递归把指数 n 折半,递归深度约 log₂n,每层只做常数次乘法与取模,总复杂度 O(log n),与底数 a 无关。
下⾯程序的输出为( )
01#include <iostream> 02using namespace std; 03 04int main(){ 05 int cnt = 0; 06 for (int a = 1; a <= 10; a++) 07 for (int b = 1; b <= 10; b++) 08 for (int h = 1; h <= 10; h++) 09 if ((a + b) * h == 20) 10 cnt++; 11 cout << cnt << endl; 12 return 0; 13}
B:18。由 (a+b)×h=20 且 h≤10,h 只能取 20 的因子 1、2、4、5、10;对应 a+b=20、10、5、4、2,再受 a,b≤10 约束,有序对依次为 1、9、4、3、1 组,合计 18。