下列 C++ 代码的输出结果是( )。
01#include <iostream> 02#include <cmath> 03using namespace std; 04int main() { 05 cout << (int)(sqrt(50) + log2(8)); 06 return 0; 07}
B:sqrt(50)≈7.07,log2(8)=3,两者之和约 10.07,(int) 强制截断得 10;强制类型转换直接截断小数。
下列关于 <cmath> 或 <math.h> 中的数学库函数的说法,正确的是( )。
A:sqrt(49) 返回 double,可参与浮点运算;log2、pow 返回 double 而非 int,sin(90) 的 90 表示弧度不是度。
下列关于 C++ 函数参数传递的说法,正确的是( )。
C:引用形参绑定实参后是实参别名,函数内修改引用形参通常会影响实参;值传递互不影响,指针形参可修改实参指向的数据;指针形参可修改实参指向的数据内容。
有 个字符,它们出现的次数分别为 、、、、。使用哈夫曼编码时,最小的带权路径长度 WPL 为( )。
D:哈夫曼合并:3+4=7、7+7=14、8+9=17、14+17=31,WPL=7+14+17+31=69;内部结点权值和等于 WPL。
已知网格上每个网格点有一个数字, 表示第 行第 列处网格点上的数字。若 表示从网格左上角(第 行第 列)走到第 行第 列时能取得的最大数字和,且每次只能向右或向下移动。对于 且 的位置,正确的状态转移代码为( )。
C:求最大数字和,dp[i][j]=a[i][j]+max(dp[i-1][j], dp[i][j-1]),取上方与左方较大者累加当前格。
已知 ,,并且对 有 。若 ,则 的值为( )。
C:f[2]=max(f[1],f[0]+a[2])=max(2,7)=7;f[3]=max(7,2+9)=11;f[4]=max(11,7+3)=11;f[5]=max(11,11+1)=12。
下面代码是一维数组优化 背包的核心片段,其中 表示第 件物品的重量, 表示第 件物品的价值。横线处应填入( )。
01for (int i = 1; i <= n; i++) { 02 for (int c = W; c >= w[i]; c--) { 03 __________; 04 } 05}
D:0/1 背包一维转移 dp[c]=max(dp[c], dp[c-w[i]]+v[i]),容量倒序枚举保证每件物品最多选一次,故选 D。
下面程序片段主要体现的算法思想是( )。
01void dfs(int x, int y) { 02 vis[x][y] = true; 03 for (int k = 0; k < 4; k++) { 04 int nx = x + dx[k], ny = y + dy[k]; 05 if (inside(nx, ny) && a[nx][ny] == 1 && !vis[nx][ny]) 06 dfs(nx, ny); 07 } 08}
A:从起点按四方向扩散标记连通的 1 区域,是典型的泛洪算法(Flood Fill,DFS 实现);Flood Fill 也可用 BFS 实现。
下列关于排序稳定性的说法,正确的是( )。
A:冒泡排序只交换相邻逆序元素,相等元素相对顺序不变,是稳定排序;选择、快排一般不稳定,稳定排序不会改变相等元素顺序;稳定排序不改变相等元素相对顺序。
无向图的边为 ,,,,。从顶点 开始进行 BFS,每轮根据出队顶点,将与其相邻顶点按编号从小到大入队,则顶点 第一次入队时,队列的状态为( )。
C:BFS 从 1 出发:先入队 2、3;出队 2 时入队 4,此时队列为 [3,4],即顶点 4 第一次入队时的队列状态。故选 C。
一个长度为 、下标为 到 的哈希表采用线性探测法处理冲突,哈希函数为 h(x) = x % 11。依次插入 、、、、,则 最终存放在下标( )。
D:22%11=0 存 0、33 探测后存 1、4 存 4、15 存 5;26%11=4,线性探测 4、5 均占用,落到 6 号下标。
关于哈希表处理冲突的方法,下列说法正确的是( )。
B:链地址法把哈希到同一位置的元素组织在同一桶(链表)中;线性探测不会放弃插入,表长素数不能避免冲突,开放定址查找要考虑探测位置,故选 B。
某算法需要枚举 个对象;对每个对象,还需要进行一次二分查找。若二分查找的对象规模也是 ,则该算法的时间复杂度通常为( )。
B:n 个对象每个都要做一次规模为 n 的二分查找(O(log n)),总时间复杂度 O(n log n);注意是 n 次二分而不是一次。
在升序数组中用二分查找第一个大于等于 的位置。若当前中点 满足 ,下一步应( )。
B:二分找第一个 ≥ x 的位置,a[mid]<x 说明 mid 及其左边都小于 x,令左边界 l=mid+1 继续向右查。故选 B。
在如下网格中,# 表示不能经过的格子,. 表示可以经过的格子。从左上角走到右下角,每次只能向右或向下移动,不同路径共有( )条。
. . . . . . # . # . . . . . . # . # . . . . . . .
D:逐格 DP 统计:避开 # 后 dp(0,0)=1,最终 dp(4,4)=8 条不同路径(可用递推逐行累加验证);障碍格子的 dp 值置 0 即可。
使用 cmath 或 math.h 中的三角函数时,角度参数默认采用角度制。
错。cmath/math.h 的三角函数参数默认是弧度制,不是角度制,需自行把角度换算成弧度;如 sin(90) 表示 90 弧度而非 90°。
使用 cmath 或 math.h 中的 pow(2, 10) 计算 时,由于参数均为整型 int,返回值类型也为整型 int。
错。pow 返回 double 类型,即使参数都是 int,pow(2,10) 的返回值类型仍是 double(值为 1024.0)。
背包使用一维数组优化时,容量从小到大枚举也能保证每件物品最多被选一次。
错。一维数组优化 0/1 背包必须容量从大到小枚举;从小到大枚举会让同一物品被重复选取,退化成完全背包;这是 0/1 背包与完全背包实现的关键区别。
哈希表采用开放定址法时,即使哈希函数设计合理,也仍然可能发生冲突。
对。开放定址法只是处理冲突的方式,哈希函数设计得再合理仍可能发生冲突,只是概率较低;冲突只能减少不能完全消除;冲突是哈希表固有的现象。
同一个图从同一个起点进行深度优先搜索,访问序列一定与邻接点的枚举顺序无关。
错。DFS 访问序列取决于邻接点的枚举顺序,同一图同一起点按不同顺序枚举邻点会得到不同序列;不同枚举顺序对应不同访问序列,故错。
泛洪算法可以用递归 DFS 实现,但地图很大时可能由于递归层数过深导致调用栈溢出等运行时错误。
对。泛洪递归实现每层递归都会压栈,地图很大时递归层数过深会导致调用栈溢出等运行时错误;因此大图常用 BFS 队列实现泛洪。故正确。
哈夫曼树中不存在度为 的结点。
对。哈夫曼树每次合并两个结点生成一个度为 2 的新结点,叶子度为 0,不存在度为 1 的结点;这是哈夫曼树的重要结构性质。故正确。
冒泡排序的常见实现是稳定排序,选择排序也是。
错。冒泡排序是稳定的,但选择排序一般不稳定,B 说选择排序也稳定,错误;选择排序会交换相等元素的相对位置;故该说法错误。故选错。
在无权图中从起点执行 BFS 时,某个顶点第一次被访问到的层数等于起点到该顶点经过的最少边数。
对。BFS 按层扩展,顶点第一次被访问时的层数等于起点到该顶点的最少边数,即最短路径长度;这也是 BFS 求无权图最短路的原理,故对。
在二维动态规划中,状态 的计算常常依赖其他状态,这些状态的计算必须在完成 的计算前完成。
对。二维 DP 中 dp[i][j] 依赖的状态(如 dp[i-1][j]、dp[i][j-1])必须先计算完成,否则转移用到的值未就绪。