#GESP1355. [GESP202603六级] 客观题
[GESP202603六级] 客观题
一、单选题(每题 2 分,共 30 分)
第 1 题 下列关于 C++ 中类的描述,正确的是 ( )
{{ select(1) }}
- 如果类没有用户声明的构造函数,那么编译器会隐式声明一个默认构造函数
- 类的析构函数可以被重载,一个类可以有多个析构函数
- 类中的所有成员都必须声明为
public - 类和结构体在
C++中没有区别,包括默认访问权限也相同
第 2 题 下列代码中,s1->draw();和 s2->draw(); 输出不同结果的主要原因是 ( )
01 class Shape {
02 public:
03 virtual void draw() {
04 cout << "绘制图形" << endl;
05 }
06
07 virtual ~Shape() {}
08 };
09
10 class Circle : public Shape {
11 public:
12 void draw() override {
13 cout << "绘制圆形" << endl;
14 }
15 };
16
17 class Rectangle : public Shape {
18 public:
19 void draw() override {
20 cout << "绘制矩形" << endl;
21 }
22 };
23
24 int main() {
25 Shape* s1 = new Circle();
26 Shape* s2 = new Rectangle();
27
28 s1->draw();
29 s2->draw();
30
31 delete s1;
32 delete s2;
33 return 0;
34 }
{{ select(2) }}
draw()是普通成员函数Shape中的draw()被声明为虚函数Circle和Rectangle中使用了public继承- 指针变量名不同
第 3 题 下面的代码在 main() 中有一行会导致编译错误,请找出来。
01 class Pet {
02 public:
03 Pet(string n, int a) : name(n), age(a) {}
04 string getName() { return name; }
05 void
birthday() { age++; }
06 private:
07 string name;
08 int age;
09 };
10
11 int main() {
12 Pet cat("奶茶", 2);
13 cout << cat.getName(); //①
14 cat.birthday(); //②
15 cat.name = "大橘"; //③
16 cout << cat.getName(); //④
17 }
{{ select(3) }}
- 第 ① 行
- 第 ② 行
- 第 ③ 行
- 第 ④ 行
第 4 题 游乐园的过山车每次限坐 人,用循环队列管理排队(容量 MAX=5,空一格判满)。下面代码执行后,循环队列是否已满? rear 的值是多少? ( )
01 const int MAX = 5;
02 int queue[MAX];
03 int front = 0, rear = 0;
04
05 // 入队
06 void enqueue(int x) {
07 queue[rear] = x;
08 rear = (rear + 1) % MAX;
09 }
10 // 出队
11 void dequeue() {
12 front = (front + 1) % MAX;
13 }
14
15 int main() {
16 enqueue(1); enqueue(2); enqueue(3); enqueue(4);
17 dequeue(); dequeue();
18 enqueue(5); enqueue(6);
19 }
{{ select(4) }}
- 已满,
rear = 1 - 未满,
rear = 1 - 已满,
rear =2 - 未满,
rear = 4
第 5 题 在以下计算机系统应用场景中,最适合使用循环队列的是 ( )
{{ select(5) }}
- 函数调用过程中,保存局部变量和返回地址
- 表达式求值中的运算符优先级处理
- 操作系统中的进程优先级调度(高优先级先执行)
- 生产者和消费者问题中的共享缓冲区
第 6 题 在二叉搜索树 中,若中序遍历的序列为 {1,2,3,4,5},且先序遍历的第一个序列元素为 ,则下列说法正确的是 ( )
{{ select(6) }}
- 该树一定是一棵完全二叉树。
- 元素 和 不可能是兄弟节点。
- 元素 所在节点的深度可能大于 (根节点深度为 )。
- 元素 一定是元素 的父节点。
第 7 题 某二叉树共有 个结点,记为 ,已知它的先序遍历序列为:A B D H I E C F J G,中序遍历序列为: H D I B E A F J C G,则该二叉树的后序遍历序列是 ( )
{{ select(7) }}
H I D E B J F G C AH I D B E J F G C AI H D E B J F G C AH I D E B F J G C A
第 8 题 下列关于树的遍历的说法中,正确的一项是 ( )
{{ select(8) }}
- 对任意一棵树进行深度优先遍历,所得序列一定唯一。
- 已知一棵二叉树的先序遍历和后序遍历序列,可以唯一确定这棵二叉树。
- 已知一棵二叉树的先序遍历和中序遍历序列,可以唯一确定这棵二叉树。
- 已知一棵二叉树的先序遍历序列,可以唯一确定这棵二叉树。
第 9 题 有 个字符,它们出现的次数分别为: {2,3,3,4,6,8},现在用哈夫曼编码为这些字符编码,最小加权路径长度 (每个字符的出现次数x它的编码长度,再把每个字符结果加起来)的值为( )
{{ select(9) }}
- 58
- 60
- 62
- 64
第 10 题 对 个不同符号进行哈夫曼编码。若生成的哈夫曼树共有 个结点,则 的值是 ( )
{{ select(10) }}
第 11 题 关于格雷编码(GrayCode),下列说法正确的是 ( )
{{ select(11) }}
- 格雷编码中,编码位数越多,相邻编码之间变化的位数也越多
- 格雷编码中,相邻两个编码的二进制位恰好有一位不同
- 格雷编码就是把普通二进制编码按位取反后得到的结果
- 格雷编码不能用于数字电路和状态转换的设计中
第 12 题 给定一棵二叉树,采用广度优先搜索 算法,返回右视图所有节点的值。其中右视图定义为:二叉树的右视图是从树的右侧看过去时可见的节点集合,即右视图中的每个节点都是某一层中最右侧的节点 ( )
01 struct TreeNode {
02 int val;
03 TreeNode* left;
04 TreeNode* right;
05 TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
06 };
07
08 vector<int> rightSideView(TreeNode* root) {
09 unordered_map<int, int> rightmostValueAtDepth;
10 int max_depth = -1;
11
12 queue<TreeNode*> nodeQueue;
13 queue<int> depthQueue;
14 nodeQueue.push(root);
15 depthQueue.push(0);
16
17 while (!nodeQueue.empty()) {
18 TreeNode* node = nodeQueue.front(); nodeQueue.pop();
19 int depth = depthQueue.front(); depthQueue.pop();
20
21 if (node != NULL) {
22 max_depth = max(max_depth, depth);
23
24 rightmostValueAtDepth[depth] = node->val;
25
26 nodeQueue.push(node->left);
27 nodeQueue.push(node->right);
28
29 depthQueue.push(________);
30 depthQueue.push(________);
31 }
32 }
33
34 vector<int> rightView;
35 for (int depth = 0; ________; ++depth) {
36 rightView.push_back(rightmostValueAtDepth[depth]);
37 }
38 return rightView;
39 };
{{ select(12) }}
-
01 depth 02 depth 03 depth < max_depth -
01 depth + 1 02 depth + 1 03 depth <= max_depth -
01 depth + 1 02 depth + 1 03 depth < max_depth -
01 depth 02 depth 03 depth <= max_depth
第 13 题 下列关于树的深度优先搜索 的说法中,正确的是 ( )
{{ select(13) }}
- 对树进行 时,一定是按层从上到下依次访问结点
- 对任意一棵树进行 ,得到的遍历序列唯一
- 对一棵树进行 时,常借助递归或栈实现
- 只能用于二叉树,不能用于普通树
第 14 题 小朋友们去邻里拜年,每个家里有不同数量的糖果。规则是:不能连续进入两个相邻的房子(即不能同时取相邻两家的糖果)。目标是拿到最多糖果。以下是代码实现,请补全横线。( )
01 int visit(vector<int>& nums) {
02 if (nums.empty()) {
03 return 0;
04 }
05 int size = nums.size();
06 if (size == 1) {
07 return nums[0];
08 }
09 vector<int> dp = vector<int>(size, 0);
10 dp[0] = nums[0];
11 dp[1] = max(nums[0], nums[1]);
12
13 for (int i = 2; i < size; i++) {
14 dp[i] = ______; // 在此处填写代码
15 }
16
17 return dp[size - 1];
18 }
{{ select(14) }}
dp[i] = dp[i - 1] + nums[i];dp[i]= max(dp[i - 1],dp[i - 2] * nums[i]);dp[i] = max(dp[i - 1],dp[i - 2] + nums[i]);dp[i] = dp[i - 2] + nums[i];
第 15 题 元宵节晚上,小朋友沿着一条发光石板路前进,每次可向前走 块或 块石板。动态规划定义如下:dp[i]=dp[i -1]+dp[i -2],下面关于 dp[i] 的含义最合适的是 ( )
{{ select(15) }}
- 走到第 块石板的不同走法数量
- 走到第 块石板时,已经走过的石板总数
- 从第 块石板走回起点的最少步数
- 从第 块石板走回起点的最大步数
二、判断题(每题 2 分,共 20 分)
第 1 题 下面定义了一个表示二维坐标点的类 Point,并提供了一个带参数的构造函数,但第 行 Point b;会调用编译器自动生成的默认构造函数,将 b.x 和b.y 初始化为 ,程序可以正常编译运行。
01 class Point {
02 public:
03 double x, y;
04 Point(double px, double py) : x(px), y(py) {}
05 void print() {
06 cout << "(" << x << ", " << y << ")";
07 }
08 };
09
10 int main() {
11 Point a(3.0, 4.0); // ①
12 Point b; // ②
13 a.print();
14 }
{{ select(16) }}
- 正确
- 错误
第 2 题 C++ 中的继承支持单继承和多继承,但子类无法直接访问父类的私有成员。
{{ select(17) }}
- 正确
- 错误
第 3 题 对如下结构的树,执行 travel 函数,输出结果是 1 2 3 4 5。
1
/ \
2 3
/ \
4 5
01 struct Node {
02 int val;
03 Node *left, *right;
04 Node(int v) : val(v), left(nullptr), right(nullptr) {}
05 };
06
07 void travel(Node* root) {
08 if (!root) return;
09 stack<Node*> s;
10 s.push(root);
11
12 while (!s.empty()) {
13 Node* cur = s.top(); s.pop();
14 cout << cur->val << " ";
15
16 if (cur->right) s.push(cur->right);
17 if (cur->left) s.push(cur->left);
18 }
19 }
{{ select(18) }}
- 正确
- 错误
第 4 题 若所有字符出现频率相同,则哈夫曼编码一定会得到完全二叉树。
{{ select(19) }}
- 正确
- 错误
第 5 题 哈夫曼编码是一种变长的前缀编码,在解码时不需要额外的分隔符就能唯一还原,这是因为在哈夫曼树中,任何一个字符的叶子结点都不会成为另一个字符结点的祖先。
{{ select(20) }}
- 正确
- 错误
第 6 题 在 C++ 中使用一维数组 vector<int>tree 存储按层序遍历的完全二叉树时,若根节点存储在 tree[0],则对于任意非空节点 tree[i],其右孩子(如果存在)必然位于 tree[2*i+2]。
{{ select(21) }}
- 正确
- 错误
第 7 题 在 C-+ 中使用栈来非递归地实现二叉树的前序遍历时,为了保证遍历顺序正确,在处理完当前结点后,应该先将该结点的左孩子压入栈中,然后再将右孩子压入栈中。
{{ select(22) }}
- 正确
- 错误
第 8 题 设二叉树共有 个结点,函数 preorderTraversal 以下代码的时间复杂度为 ,空间复杂度为 。
01 struct TreeNode {
02 int val;
03 TreeNode* left;
04 TreeNode* right;
05 TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
06 };
07
08 void preorder(TreeNode *root, vector<int> &res) {
09 if (root == nullptr) {
10 return;
11 }
12 res.push_back(root->val);
13 preorder(root->left, res);
14 preorder(root->right, res);
15 }
16
17 vector<int> preorderTraversal(TreeNode *root) {
18 vector<int> res;
19 preorder(root, res);
20 return res;
21 };
{{ select(23) }}
- 正确
- 错误
第 9 题 下列代码实现了一个 背包的一维动态规划代码,内层循环是经典的逆序写法。若将内层循环改成正序遍历(即 for(intj=w[i];j<=W;j++)),仍能得到正确答案。
01 int main() {
02 int W = 5;
03 int w[] = {2, 3, 4};
04 int v[] = {10, 1, 1};
05 int n = 3;
06 int dp[6] = {0};
07
08 for (int i = 0; i < n; i++) {
09 for (int j = W; j >= w[i]; j--) { // ← 逆序!
10 dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
11 }
12 }
13 cout << dp[W];
14 }
{{ select(24) }}
- 正确
- 错误
第 10 题 在动态规划问题中,状态空间相同且没有重复计算的情况下,“状态转移方程+递推”与“递归+记忆化搜索”的时间复杂度通常相同。
{{ select(25) }}
- 正确
- 错误