关于 C++ 类和对象的说法,错误的是( )。
D:错误项。C++ 不允许在自定义函数内部再嵌套定义新函数(无局部函数),这是 Python 等语言的特性;A、B、C 为本题认可的正确说法。
有关下面 C++ 代码的说法,错误的是( )。
01class Rectangle 02{ 03private: 04 class Point 05 { 06 public: 07 double x; 08 double y; 09 }; 10 Point a, b, c, d; 11 double length; 12 double width; 13public:
C:错误项。Point 是定义在 Rectangle 内的内部类,外部访问须通过外部类作用域(Rectangle::Point),不能脱离外部类随便访问;A、B、D 关于嵌套类的说法正确。
有关下面 C++ 代码的说法,正确的是( )。
01using namespace std; 02class newClass 03{ 04 public: 05 static int objCounter; 06 07}; 08int newClass::objCounter=2; 09int main() 10{ 11 newClass classA; 12 newClass classB; 13 cout<<newClass::objCounter<<endl; 14 cout<<classB.objCounter<<endl; 15}
C:objCounter 是静态成员,newClass::objCounter 与 classB.objCounter 两种访问方式都合法,第 14、15 行均正确;D 把第 6 行声明改成 objCounter+=1 不合法。
有关下面 C++ 代码的说法,错误的是( )。
01struct BiNode { 02 char data; 03 BiNode* lchid,*rchid; 04}; 05class BiTree { 06private: 07 BiNode* Creat(); 08 void Release(BiNode* bt); 09 BiNode* root; 10public: 11 BiTree() { 12 root = Creat(); 13 } 14 ~BiTree() { 15 Release(root);
D:错误项。析构函数可以省略,编译器会隐式生成默认析构函数;BiNode 用于构造二叉树结点、BiTree 构造函数创建二叉树,A、B、C 均正确。
基于第 题的定义,有关下面 C++ 代码的说法正确的是( )。
01void Order(BiNode* bt) { 02 if (bt == nullptr) 03 return; 04 else { 05 cout << bt->data; 06 Order(bt->lchid); 07 Order(bt->rchid); 08 } 09}
B:Order 先输出根结点 bt->data,再递归遍历左子树、右子树,是根左右的前序遍历;A 中序、C 左根右、D 左右根后序均与代码顺序不符。
有关下面 C++ 代码的说法正确的是( )。
01typedef struct LinkList { 02 int data; 03 04 LinkList* next; 05 06 LinkList* prev; 07 08}LinkList,LinkNode; 09bool ListInit(LinkList* &L) { 10 11 L = new LinkNode; 12 if (!L)return false; 13 14 L->next = NULL; 15 L->prev = NULL; 16 L->data = -1; 17 18 return true; 19 20}
B:LinkList 结点同时含 next 与 prev 两个指针,分别指向后继与前驱,构成双向链表;不是单向链表、循环链表,也不存在独立的「指针链表」类型。
对 hello world 使用霍夫曼编码(Huffman Coding),最少比特(比特)为( )。
B:32。统计 hello world 各字符频率(l 出现 3 次、o 2 次、其余 6 个字符各 1 次),按频率构造哈夫曼树,频率高的编码短,全部字符编码总长 32 比特。
下面的 fiboA() 和 fiboB() 两个函数分别实现斐波那契数列,该数列第 、第 项值为 ,其余各项分别为前两项之和。下面有关说法错误的是( )。
01int fiboA(int n) 02{ 03 if(n==0) 04 return 1; 05 if(n==1) 06 return 1; 07 else 08 { 09 return fiboA(n-1)+fiboA(n-2); 10 } 11} 12int fiboB(int n) 13{ 14 if( (n==0) || (n==1) ){ 15 fiboB[n]=n; 16 return n; 17 } 18 else{ 19 if(fiboB[n] == 0){ 20 fiboB[n]=FiboB(n-1)+FiboB(n-2); 21 } 22 return fiboB[n]; 23 } 24}
D:错误项。fiboA 递归实现,n 较大时 fiboA(n-1) 与 fiboA(n-2) 大量重叠计算,是指数级低效,代码短不代表效率高;fiboB 用数组记忆化,是动态规划实现。
有关下面 C++ 代码不正确的说法是( )。
01int Depth(BiTree T) 02{ 03 if (T == NULL) 04 { 05 return 0; 06 } 07 else 08 { 09 int m = Depth(T->lchild); 10 int n = Depth(T->rchild); 11 if (m > n) 12 { 13 return m + 1; 14 } 15 else 16 { 17 return n + 1; 18 } 19 } 20}
B:错误项。Depth 对左右子树递归求深度取大再加 1,参数可以是任意结点(子树根),非根结点同样可作为参数,不必是整棵树根。
下面有关树的存储,错误的是( )。
D:错误项。只有完全二叉树、满二叉树结点下标连续,适合用 list 顺序存储;一般树的下标不连续,用 list 存储会浪费空间,A、B、C 均正确。
构造二叉树 [1,2,3,null,4] ( )。
A:括号表示法写作「父(左子树)(右子树)」:根 1 的孩子是 2、3,2 的左孩子为空写 ()、右孩子为 4,故为 1(2()(4))(3)。
下面有关布尔类型的函数的说法,正确的是( )。
A:bool 类型函数只能返回 true 或 false,即 0 与 1 两个值;可以无参数,且必须有返回值,B、C、D 均错误。
通讯卫星在通信网络系统中主要起到( )的作用。
B:通讯卫星接收地面站信号并放大转发,实现跨地域的无线电通信,主要起信号中继作用;信息过滤、避免攻击、数据加密都不是卫星的核心职责。
小杨想编写一个判断任意输入的整数 N 是否为素数的程序,下面哪个方法不合适?( )
C:二分答案要求答案具有单调性,判断单个整数是否素数没有可二分的结构;埃氏筛、线性筛、枚举试除都能正确判断素数,故 C 不合适。
内排序有不同的类别,下面哪种排序算法和冒泡排序是同一类?( )
B:按排序方法分类,冒泡与快速排序同属交换排序类(通过交换元素消除逆序对);希尔、直接插入属插入排序类,堆排序属选择排序类,故选 B。
在面向对象中,方法在 C++ 的 class 中表现为 class 内定义的函数。( )
A:正确。面向对象中的「方法」即对对象施加的操作,在 C++ 类中表现为类内定义的成员函数,通过对象或类来调用,这就是方法与类内函数的对应关系。
C++ 类的定义中,可以没有构造函数,会给出默认的构造函数( )。
A:正确。若类未定义任何构造函数,编译器会自动生成隐式的默认构造函数(无参,逐成员默认初始化);若自定义了构造函数,默认构造函数则不再自动提供。
如果某个 C++ 对象(object)支持下标运算符(方括号运算符),则该对象在所对应 class 中以成员函数的形式进行了重载。( )
A:正确。[] 是运算符,只有重载了 operator[] 成员函数的自定义类型才能对对象使用下标访问,否则编译器报错。
深度优先搜索(DFS,Depth First Search 的简写)属于图算法,其过程是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。( )
A:正确。DFS 沿一条分支递归深入到底再回溯,配合 visited 标记保证每个节点只访问一次,是图与树的经典遍历算法。
哈夫曼编码(Huffman Coding)具有唯一性,因此有确定的压缩率。( )
B:错误。哈夫曼编码不唯一:合并两个最小权值的顺序、左右孩子摆放方式不同会得到不同的编码树,压缩率也随之改变,不能说有确定的压缩率。
在下面 C++ 代码中,由于删除了变量 ptr,因此 ptr 所对应的数据也随之删除,故第 行代码被执行时,将报错。( )
01 int * ptr=new int(10); 02 cout<<*ptr<<endl; 03 delete ptr; 04 cout<<*ptr<<endl;
B:错误。delete 只释放 ptr 指向的堆内存,ptr 变量本身仍在且保存原地址(悬空指针),再次解引用是未定义行为,可能输出垃圾值,但不保证报错。
二叉搜索树查找的平均时间复杂度为 。( )
A:正确。平均情况下 BST 近似平衡,查找每比较一次就排除一侧子树,期望比较次数与树高同阶,为 O(log N);只有退化成链时最坏才到 O(N)。
二叉搜索树可以是空树(没有任何节点)或者单节点树(只有一个节点),或者多节点树。如果是多节点,则左节点的值小于父节点的值,右节点的值大于父节点的值,由此推理,右节点树的值都大于根节点的值,左节点树的值都小于根节点的值。( )
A:正确。BST 定义递归传递:左子树所有结点小于根、右子树所有结点大于根,因此整棵右子树的值都大于根、左子树都小于根;空树与单节点树也满足定义。
小杨想写一个程序来算出正整数 N 有多少个因数,经过思考他写出了一个重复没有超过 N/2 次的循环就能够算出来了。( )
A:正确。除 N 自身外所有因数都不超过 N/2,循环枚举 1 到 N/2 判断整除即可统计全部因数(再把 N 计入),重复次数不超过 N/2;更优做法是只试到 sqrt(N)。
同样的整数序列分别保存在单链表和双向链中,这两种链表上的简单冒泡排序的复杂度相同。( )
A:正确。冒泡排序只做相邻比较交换,单链表与双向链表都需 N-1 趟扫描、每趟 O(N),总复杂度同为 O(N²);双向链表多出的反向指针不影响渐进复杂度。