已知小写字母b 的ASCII码为 98,下列C++代码的输出结果是( )。
01#include <iostream> 02using namespace std; 03int main() { 04 char a = 'b' + 1; 05 cout << a; 06 return 0; 07}
B:字符 b 的 ASCII 为 98,字符加 1 得 99 即字符 c,赋给 char 变量后 cout 输出字符 c。故选 B。
已知a 为int 类型变量,p 为int * 类型变量,下列表达式不符合语法的是( )。
B:指针不能相乘,pp 语法错误;aa、a&&a、p&&p 都是合法表达式,其中 p&&p 是把指针转为布尔值;乘法只对数值类型有意义,指针不支持。
下列关于C++类的说法,错误的是( )。
A:包含纯虚函数的抽象类仍可定义成员变量,只是不能直接实例化,A 说法错误,C、D 的说法均正确;抽象类的作用是作为基类提供接口。
已知数组a 的定义int a[10] = {-1};,下列说法不正确的是( )。
B:int a[10]={-1} 只把第一个元素初始化为 −1,其余 9 个元素自动初始化为 0,B 说法错误;只有显式列出的元素才用给定初值。
一棵完全二叉树有个结点,则叶结点有多少个?( )
C:前 7 层满共 127 结点,第 8 层有 165−127=38 个叶;第 7 层 64 结点中前 19 个有孩子,余 45 个为叶,共 38+45=83。
下列关于二叉树的说法,错误的是( )。
C:二叉排序树高度不固定,插入有序数据时会退化成链使高度达 n,并非一定为 ⌊log₂n⌋,C 说法错误;只有平衡的二叉排序树才接近 log 高度。
下列关于树和图的说法,错误的是( )。
D:有向图存在生成树只说明弱连通,不保证任意两点双向可达,故不一定强连通,D 说法错误;弱连通只需单向可达;生成树是弱连通概念,强连通要求双向可达。
对一个包含 个顶点、 条边的图,执行广度优先搜索,其最优时间复杂度是( )。
A:用邻接表存储时 BFS 每个顶点入队一次、每条边访问一次,最优时间复杂度为 O(V+E);邻接矩阵存储则为 O(V²),故选 A。
以下哪个方案不能合理解决或缓解哈希表冲突( )。
A:用新元素覆盖冲突表项会丢失旧数据,不能合理解决冲突;链地址、开放定址、再哈希三种方案都合理,故选 A;覆盖策略会直接破坏已有数据,不可取。
以下关于贪心法和动态规划的说法中,错误的是( )。
D:DP 状态数可能随规模指数增长(如状态包含集合的题目),DP 不一定具有多项式时间复杂度,D 说法错误;如状态压缩类 DP 状态数为 2ⁿ。
下面程序的输出为( )。
01#include <iostream> 02using namespace std; 03int fib(int n) { 04 if (n == 0) return 1; 05 return fib(n - 1) + fib(n - 2); 06} 07int main() { 08 cout << fib(6) << endl; 09 return 0; 10}
D:fib 只对 n==0 有终止返回,fib(1) 会继续调用 fib(0) 和 fib(−1),fib(−1) 再调 fib(−2)、fib(−3)…无限递归,无法正常结束。
下面程序的时间复杂度为( )。
01int rec_fib[MAX_N]; 02int fib(int n) { 03 if (n <= 1) 04 return n; 05 if (rec_fib[n] != 0) 06 return rec_fib[n]; 07 return fib(n - 1) + fib(n - 2); 08}
A:函数只读 rec_fib 从不写入,记忆化失效,每次仍递归 fib(n-1)+fib(n-2),复杂度为指数级 O(φⁿ),φ=(√5+1)/2。
下面 init_sieve 函数的时间复杂度为( )。
01int sieve[MAX_N]; 02void init_sieve(int n) { 03 for (int i = 1; i <= n; i++) 04 sieve[i] = i; 05 for (int i = 2; i <= n; i++) 06 for (int j = i; j <= n; j += i) 07 sieve[j]--; 08}
C:内层循环 j 以 i 为步长,总次数 n/2+n/3+…+n/n≈n ln n,即调和级数,复杂度 O(n log n),故选 C。
下面 count_triple 函数的时间复杂度为( )。
01int gcd(int m, int n) { 02 if (m == 0) return n; 03 return gcd(n % m, m); 04} 05int count_triple(int n) { 06 int cnt = 0; 07 for (int v = 1; v * v * 4 <= n; v++) 08 for (int u = v + 1; u * (u + v) * 2 <= n; u += 2) 09 if (gcd(u, v) == 1) { 10 int a = u * u - v * v; 11 int b = u * v * 2; 12 int c = u * u + v * v; 13 cnt += n / (a + b + c); 14 } 15 return cnt; 16}
C:v 循环约 √n 次、u 循环约 √n 次,循环体总执行约 O(n) 次,每次 gcd 为 O(log n),故总复杂度 O(n log n)。
下列选项中,哪个不可能是下图的深度优先遍历序列()。
B:DFS 能走就走:B 中 5→7→8→9 可走通,回溯后 1→2,而 2 的未访问邻点 3 应先于 4 访问,B 却先 4 后 3,破坏回溯顺序。
C++语言中,表达式9&&12的结果类型为int、值为8。
错。9&&12 是逻辑与:9、12 转布尔均为真,结果为 true(int 值为 1),不是 8;8 是位与 9&12 的结果,故错。
C++语言中,在有int a[10];定义的范围内,通过表达式a[-1]进行访问将导致编译错误。
错。a[-1] 是数组下标越界访问,编译器不会报错,运行期属于未定义行为:可能崩溃、读到垃圾值或破坏相邻内存,故不会产生编译错误;越界访问在编译期无法检测。
选择排序一般是不稳定的。
对。选择排序每趟把未排序区的最小值与当前位置交换,可能把相等的元素换到另一个相等元素之后,故一般不稳定;相等元素的相对顺序无法保证。
C++语言中,float和int类型一般都是 字节,因此float类型能够表达不同的浮点数值的数量,与 int类型能够表达不同的整数值的数量是相同的。
错。float 存在 NaN、正负零等多种位模式对应同一数值或非数值,能表达的不同数值数量少于 int 的 2³² 种,故说法错误。
使用math.h或cmath头文件中的对数函数,表达式 log(256)的结果类型为double、值约为8.0。
错。log 是自然对数 ln:log(256)=ln256≈5.55,不是 8.0;8 是 log2(256) 的结果,故说法错误;注意区分 ln 与 log₂。
一棵有 N 个节点的完全二叉树,则树的深度为 。
对。完全二叉树深度为 ⌊log₂N⌋+1,即结点逐层从左到右排满时的高度公式,正确;如 N=4 时深度为 3,与公式一致。故正确。
邻接表和邻接矩阵都是图的存储形式。通常,使用邻接表比使用邻接矩阵的时间复杂度更低。
错。不能说邻接表总比邻接矩阵复杂度低:判断两点是否有边矩阵 O(1) 更快,稠密图矩阵空间也更省,笼统说法错误;两者各有适用场景。
C++语言中,类的构造函数可以声明为私有(private)。
对。构造函数可以声明为 private(如单例模式),从而限制外部直接创建该类的对象;外部代码只能通过静态工厂方法间接创建,故对。
泛洪算法的递归实现容易造成溢出,因此大的二维地图算法中,一般使用广度优先搜索实现。
对。泛洪递归实现易发生栈溢出,大二维地图一般改用 BFS(队列)实现,避免递归层数过深;递归实现仅适用于小地图;但递归写法代码更简洁,小地图可用。
很多游戏中为玩家设置多种可供学习的技能,要学习特定技能又往往需要先学习个或以上的前置技能。尽管这样的技能间依赖关系常被玩家称为“技能树”,但它并不一定是树,更可能是有向无环图。
对。技能依赖可能一个技能有多个前置、多个后继甚至成环,通常抽象为有向无环图而非严格意义的树,故不能当树建模;有向无环图可用拓扑排序处理技能前置关系。