近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( )。
A:输入。手写板把书写轨迹转换为电信号送入计算机,供程序读取,与键盘、鼠标同属输入设备;它不向用户呈现信息,故不是输出、控制或记录设备。
如果 a 和 b 均为 int 类型的变量,且 b 的值不为 ,那么下列能正确判断“a 是 b 的 倍”的表达式是( )。
D:(a==3*b)。A 中 a>>3 是除以 8,与 3 倍无关;B 只判断 a-b 能被 3 整除;C 中整数除法 a/b==3 在 a=7、b=2 时也成立(7/2=3),会误判;D 严格等价于 a 等于 b 的三倍。
以下不属于面向对象程序设计语言的是( )。
D:C。C 语言是面向过程的语言,没有类、对象、继承、多态等机制;C++、Python、Java 都支持类与对象,是面向对象程序设计语言。
下面有关 C++ 类定义的说法,错误的是( )。
D:错误项。类成员的类型有限制,不能是抽象类或类自身等「任意类型」;A 实例化时自动调用构造函数、B 单参构造函数可实现自动类型转换、C 可重载 > 与 < 实现大小比较,均正确。
有关下面 C++ 代码的说法,错误的是( )。
01#include <iostream> 02#include <string> 03using namespace std; 04 05class MyStr { 06 string data; 07 public: 08 MyStr(string _data): data(_data) {} 09}; 10 11int main() { 12 MyStr st("ABC"); 13 cout << st << endl; 14 return 0; 15}
A:MyStr 未重载 << 运算符,ostream 无法输出该类型对象,cout<<st 会编译报错而不能正常输出 ABC,故 A 是错误说法;data 确为成员变量、构造函数会正常执行,B、C 正确。
下列关于命名空间的说法错误的是( )。
D:错误项。多个命名空间存在同名函数时,using 同时引入会使调用产生二义性,但这是编译期错误而非程序运行错误;A 命名空间可嵌套、B 只能定义在全局作用域、C 可存放变量与函数均正确。
有关下面 C++ 代码的说法,正确的是( )。
01#include <iostream> 02using namespace std; 03 04class ManyData { 05 int * __data; 06 int head, tail, capacity; 07public: 08 ManyData(int cap) { 09 capacity = cap; 10 __data = new int[capacity]; 11 head = tail = 0; 12 } 13 void push(int val) { 14 __data[tail++] = val; 15 } 16 int pop() { 17 return __data[--tail]; 18 } 19 int size() { 20 return tail - head; 21 } 22}; 23int main() { 24 auto myData = ManyData(100); 25 myData.push(1); 26 myData.push(2); 27 myData.push(3); 28 myData.push(100); 29 cout << myData.size() << endl; 30 cout << myData.pop() << endl; 31 return 0; 32}
D:正确。push/pop 未做容量与越界检查,装满后继续 push 会越界写、空时 pop 读到未初始化数据,增加异常处理可避免运行或逻辑错误;pop 从尾部取,是栈不是队列;__data 私有,类外访问报错,A、B、C 均错。
有关下面 C++ 代码的说法,错误的是( )。
01#include <iostream> 02using namespace std; 03 04class MoreData { 05 int * __data; 06 int head, tail, capacity; 07public: 08 MoreData(int cap) { 09 capacity = cap; 10 __data = new int[capacity]; 11 head = tail = 0; 12 } 13 MoreData & push(int val) { 14 __data[tail++] = val; 15 return *this; 16 } 17 int pop() { 18 return __data[head++]; 19 } 20 int size() { 21 return tail - head; 22 } 23}; 24int main() { 25 auto myData = MoreData(100); 26 myData.push(1); 27 myData.push(2); 28 myData.push(3); 29 myData.push(11).push(12).push(13); 30 cout << myData.pop() << endl; 31 return 0; 32}
B:错误项。push 返回 MoreData&(*this 的引用),支持 myData.push(11).push(12).push(13) 连续调用,第 29 行不会编译错误;pop 从头部取、先进先出可构造队列,__data 是私有成员,A、C 正确。
某内容仅会出现 ABCDEFG,其对应的出现概率为 、、、、、、,如下图所示。
按照哈夫曼编码规则,假设 B 的编码为 11,则 D 的编码为( )。
B:10011。从哈夫曼树根结点沿到达 D 的路径逐边读取 0/1 标记(左 0 右 1 约定),得到编码 10011;该编码与 B=11 互不为前缀,满足前缀码要求,其余选项与图中路径不符。
下面有关格雷码的说法,错误的是( )。
B:错误项。格雷码的核心性质是相邻两个编码只有一位不同(含首尾循环),并因转换误差小被用作可靠性编码,A、C、D 均正确;「唯一性编码」并非格雷码的性质,故选 B。
有关下图的二叉树,说法正确的是( )。
B:图中树每个结点左子树值均小于根、右子树值均大于根,中序升序,是二叉搜索树;任意结点左右子树层差不超 1,又是平衡二叉树。它不是满二叉树,故 A 不成立。
个节点的二叉搜索树,其查找的平均时间复杂度为( )。
C:O(log N)。BST 查找每次比较后丢弃一侧子树,平均情况下树较平衡,比较次数与树高同阶,期望 O(log N);仅当退化成链时最坏为 O(N),A、B、D 均不合题意。
青蛙每次能跳 或 步。下面是青蛙跳到第 步台阶 C++ 实现代码。该段代码采用的算法是( )。
01int jumpFrog(int N) { 02 if (N <= 3) 03 return N; 04 return jumpFrog(N - 1) + jumpFrog(N - 2); 05}
C:动态规划。f(N)=f(N-1)+f(N-2) 是典型状态转移方程,把跳 N 阶拆成先跳 1 步或 2 步两个子问题,子问题相互重叠,符合 DP 的最优子结构;本题用递归实现(未记忆化),故不是贪心、分治或简单递推。
个节点的双向循环链,在其中查找某个节点的平均时间复杂度是( )。
B:O(N)。链表没有随机访问能力,查找必须从某结点出发逐结点比较;双向循环链表只是双向可走、首尾相连,平均仍要查约 N/2 个结点,平均时间复杂度 O(N)。
关于 C++ 语言,以下说法不正确的是( )。
D:说法不准确。基本类型的全局常量可在编译期完成初始化,并非都要在 main 前动态初始化,故 D 错;A 常量对象只能调 const 成员函数、C 静态成员对象须在 main 前初始化正确。官方解析认为 B 也有特例(const static int 可在类内初始化),B、D 均算对。
TCP/IP 的传输层的两个不同的协议分别是 UDP 和 TCP。
A:正确。TCP/IP 协议族中,传输层只包含 TCP(面向连接、可靠传输)和 UDP(无连接、尽力交付)这两个不同协议,二者共同构成传输层。
5G 网络中,5G 中的 G 表示 Gigabytes/s,其中 GB = MB。
B:错误。5G 中的 G 指 Generation(代),表示第五代移动通信技术,与字节单位无关;1GB=1024MB 虽正确,但不是 5G 中 G 的含义。
在面向对象中,类是对象的实例。
B:错误。关系说反了:类是抽象的模板,对象是类的实例,二者是模板与成品的关系;应为「对象是类的实例」,而不是「类是对象的实例」。
在 C++ 类的定义中,使用 static 修饰符定义的静态成员被该类的所有对象共享。
A:正确。static 修饰的静态成员属于类本身,在内存中只保存一份,该类的所有对象共享同一份数据,任一对象修改后全体可见。
在 C++ 类的定义中,可以定义初始化函数或运算符函数等。
A:正确。类中可以定义构造函数(初始化函数)完成对象创建时的初始化,也可以重载运算符(如 operator+)定义运算符函数,二者均为合法成员函数。
DFS 是深度优先算法的英文简写。
A:正确。DFS 是 Depth First Search 的英文缩写,即深度优先搜索,遍历时优先沿一条分支向深处扩展,是图与树的经典搜索算法。
哈夫曼编码是一种有损压缩算法。
B:错误。哈夫曼编码按字符出现频率构造前缀码,解码可无失真还原原文,属于无损压缩;有损压缩会丢失部分信息,如 JPEG。
有些算法或数据结构在 C/C++ 语言中使用指针实现,一个典型的例子就是链表。因此,链表这一数据结构在 C/C++ 语言中只能使用指针来实现。
B:错误。链表只需记录后继结点的位置,除指针外还可用数组下标模拟(静态链表,用 next 数组存后继下标),并非只能靠指针实现。
如果节点数为 ,广度搜索算法的最差时间复杂度为 。
A:正确。CCF 官方答案认为广度优先搜索最差时间复杂度可记为 O(N)(基于节点数 N 的简化表述),即便严格分析还包含边数 M 或邻接矩阵下 O(N²),官方以节点数为主按 O(N) 判正确。
二叉搜索树的左右子树也是二叉搜索树。
A:正确。BST 定义是递归的:左子树所有结点小于根、右子树大于根,且左右子树自身也满足同样的性质,因此左右子树也是二叉搜索树。