已知小写字母 b 的 ASCII 码为,下列 C++ 代码的输出结果是( )。
01#include <iostream> 02using namespace std; 03int main() { 04 char a = 'b' ^ 4; 05 cout << a; 06 return 0; 07}
C:'b' 的 ASCII 98,98^4=1100010₂^0000100₂=1100110₂=102,即字符 'f'。故选 C。
已知 a 为 int 类型变量,p 为 int * 类型变量,下列赋值语句不符合语法的是( )。
C:p+a 是指针算术表达式,不能作为赋值左值,p+a=p 语法错误;*(p+a)=p、(p-a)=a、p=p+a 均合法,故选 C。
下列关于 C++ 类的说法,错误的是( )。
B:构造派生类对象时先调用基类构造函数、再调用派生类构造函数,析构时顺序相反;B 说不会调用基类构造函数,错误,故选 B。故 B 正确。
下列 C++ 代码的输出是( )。
01#include <iostream> 02using namespace std; 03int main() { 04 int arr[5] = {2, 4, 6, 8, 10}; 05 int * p = arr + 2; 06 cout << p[3] << endl; 07 return 0; 08}
D:p=arr+2 指向 arr[2],p[3] 即 arr[5],数组只有 5 个元素,访问 arr[5] 越界,结果不确定、可能运行时异常。
假定只有一个根节点的树的深度为,则一棵有个节点的完全二叉树,则树的深度为( )。
A:完全二叉树深度为 ⌊log₂N⌋+1(根深度记为 1),如 N=4 时深度为 3、N=8 时深度为 4,与逐层排满的性质一致,故选 A。
对于如下图的二叉树,说法正确的是( )。
D:该二叉树按层次访问得到 ABCDE(根 A,第二层 B、C,第三层 D、E),广度优先遍历正是 ABCDE;其余序列不符合,故选 D。
图的存储和遍历算法,下面说法错误的是( )。
A:深度优先遍历需要借助栈(递归或显式栈)来实现,而不是队列;队列是广度优先搜索使用的结构,A 说法错误,B、C、D 均正确,故选 A。
一个连通的简单有向图,共有条边,则该图至少有( )个顶点。
B:连通简单有向图 28 条边,5 个顶点最多 5×4=20 条边放不下,6 个顶点最多 6×5=30 条边,故至少 6 个顶点,故选 B。
以下哪个方案不能合理解决或缓解哈希表冲突( )。
D:覆盖冲突位置的旧元素会直接丢失数据,不能合理解决冲突;每表项二次哈希、二叉排序树、额外哈希表都是合理的方案,故选 D。故 D 正确。
以下关于动态规划的说法中,错误的是( )。
B:DP 时间复杂度约为状态数乘以每个状态的转移代价,通常不等于状态个数(如 0/1 背包为 O(nW));B 说法错误,故选 B。
下面程序的输出为( )。
01#include <iostream> 02using namespace std; 03int rec_fib[100]; 04int fib(int n) { 05 if (n <= 1) 06 return n; 07 if (rec_fib[n] == 0) 08 rec_fib[n] = fib(n - 1) + fib(n - 2); 09 return rec_fib[n]; 10} 11int main() { 12 cout << fib(6) << endl; 13 return 0; 14}
A:记忆化斐波那契:fib(0)=0、fib(1)=1,递推 fib(2)=1、fib(3)=2、fib(4)=3、fib(5)=5、fib(6)=8。
下面程序的时间复杂度为( )。
01int rec_fib[MAX_N]; 02int fib(int n) { 03 if (n <= 1) 04 return n; 05 if (rec_fib[n] == 0) 06 rec_fib[n] = fib(n - 1) + fib(n - 2); 07 return rec_fib[n]; 08}
D:rec_fib[n]==0 时计算并写入 rec_fib[n],每个状态只算一次,总状态数 O(n),故复杂度 O(n),故选 D。
下面 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; 11 } 12 } 13 return -1; 14}
C:search 是二分查找,每轮把搜索区间减半,最多 log₂n 次迭代,平均与最坏时间复杂度均为 O(log n),故选 C,故选 C。
下面程序的时间复杂度为( )。
01int primes[MAXP], num = 0; 02bool isPrime[MAXN] = {false}; 03void sieve() { 04 for (int n = 2; n <= MAXN; n++) { 05 if (!isPrime[n]) 06 primes[num++] = n; 07 for (int i = 0; i < num && n * primes[i] <= MAXN; i++) { 08 isPrime[n * primes[i]] = true; 09 if (n % primes[i] == 0) 10 break; 11 } 12 } 13}
A:这是欧拉线性筛,每个合数只被其最小质因子筛掉一次,内层循环总次数为 O(n),故整体时间复杂度为 O(n),故选 A。故 A 正确。
下列选项中,哪个不可能是下图的广度优先遍历序列( )。
B:BFS 按层次遍历,6 所在层在 8 之前,B 把 8 排在 6 前面,不符合层次顺序,故 B 不可能是 BFS 序列。故 B 错误。
C++ 语言中,表达式 9 & 12 的结果类型为 int、值为 8。
对。9&12 = 1001₂ AND 1100₂ = 1000₂ = 8,其中 & 是按位与运算符,结果类型为 int,值确实是 8。
C++ 语言中,指针变量指向的内存地址不一定都能够合法访问。
对。指针可以指向任意地址,包括未分配、已释放或非法的内存(如野指针、空指针),访问这些地址可能出错,故指针指向的地址不一定能合法访问。
对个元素的数组进行快速排序,最差情况的时间复杂度为。
错。快速排序最坏情况(如数组已有序且基准总取到最值)每次划分退化,复杂度为 O(n²),平均才是 O(n log n)。故说法错误。
一般情况下,long long 类型占用的字节数比 float 类型多。
对。一般 long long 占 8 字节、float 占 4 字节(不同平台 long long 至少 8 字节),long long 字节数更多。
使用 math.h 或 cmath 头文件中的函数,表达式 pow(10, 3) 的结果的值为 1000、类型为 int。
错。pow(10,3) 的返回值类型是 double(值为 1000.0),参数虽是 int 但结果不是 int 类型,故错。
二叉排序树的中序遍历序列一定是有序的。
对。二叉排序树满足左子树所有结点小于根、右子树大于根,中序遍历按左根右访问,得到的序列必然从小到大有序,这是其定义性质,故对。
无论哈希表采用何种方式解决冲突,只要管理的元素足够多,都无法避免冲突。
对。由鸽巢原理,元素个数超过哈希表容量时必然发生冲突;元素足够多时,任何冲突处理方式都只能缓解冲突、无法完全避免,说法正确。故对,故对。
在 C++ 语言中,类的构造函数和析构函数均可以声明为虚函数。
错。构造函数不能声明为虚函数(对象构造时虚表尚未建立),只有析构函数可以声明为虚用于多态删除;故题目说两者均可虚是错误的。故错,故错。
动态规划方法将原问题分解为一个或多个相似的子问题,因此必须使用递归实现。
错。动态规划既可递归配合记忆化实现,也可用自底向上递推实现,两种方式都常见,递归只是其中一种实现形式,并非必须使用,故说法错误,故错。
如果将城市视作顶点,公路视作边,将城际公路网络抽象为简单图,可以满足城市间的车道级导航需求。
错。简单图不含车道数、方向限制、交通容量等细节,仅表示城市间的连通关系,无法满足车道级导航的需求,抽象成简单图信息不足,故错。