选择题 共15道

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15


判断题 共10道

16 17 18 19 20 21 22 23 24 25


编程题 共2道

26 27

E1032 202603 CCF-GESP C++六级真题-练习

选择题 共15道
01 下列关于 C++ 中类的描述,正确的是( )。 2分
登录后查看选项
02

下列代码中, s1->draw(); 和 s2->draw(); 输出不同结果的主要原因是( )。

class Shape {
	public:
		virtual void draw() {
			cout << "绘制图形" << endl;
		}
		virtual ~Shape() {}
};
class Circle : public Shape {
	public:
		void draw() override {
			cout << "绘制圆形" << endl;
		}
};
class Rectangle : public Shape {
	public:
		void draw() override {
			cout << "绘制矩形" << endl;
		}
};
int main() {
	Shape* s1 = new Circle();
	Shape* s2 = new Rectangle();
	s1->draw();
	s2->draw();
	delete s1;
	delete s2;
	return 0;
}
2分
登录后查看选项
03

下面的代码在 main() 中有一行会导致编译错误,请找出来。

Class Pet {
public:
	Pet(string n, int a) : name(n), age(a) {}
	string getName()  { return name; }
	void birthday() { age++; }       
private:
	string name;
	int age;
};
int main() {
	Pet cat("奶茶", 2);
	cout << cat.getName();  //第1行
	cat.birthday();         //第2行
	cat.name = "大橘";	    //第3行
	cout << cat.getName();  //第4行
}
2分
登录后查看选项
04

游乐园的过山车每次限坐 4 人,用循环队列管理排队(容量 MAX=5 ,空一格判满)。下面代码执行后,循环队列是否已满? rear 的值是多少?

const int MAX = 5;
int queue[MAX];
int front = 0, rear = 0;
// 入队
void enqueue(int x) {
	queue[rear] = x;
	rear = (rear + 1) % MAX;
}
// 出队
void dequeue() {
	front = (front + 1) % MAX;
}
int main() {
	enqueue(1);
	enqueue(2);
	enqueue(3);
	enqueue(4);
	dequeue();
	dequeue();
	enqueue(5);
	enqueue(6);
}
2分
登录后查看选项
05 在以下计算机系统应用场景中,最适合使用循环队列的是( )。 2分
登录后查看选项
06 在二叉搜索树(BST)中,若中序遍历的序列为{1, 2, 3, 4, 5},且先序遍历的第一个序列元素为3,则下列说法正确的是( )。 2分
登录后查看选项
07 某二叉树共有10个结点,记为A~J,已知它的先序遍历序列为:A B D H I E C F J G,中序遍历序列为:H D I B E A F J C G,则该二叉树的后序遍历序列是( )。 2分
登录后查看选项
08 下列关于树的遍历的说法中,正确的一项是( )。 2分
登录后查看选项
09 有 6 个字符,它们出现的次数分别为: {2, 3, 3, 4, 6, 8} ,现在用哈夫曼编码为这些字符编码,最小加权路径长度WPL(每个字符的出现次数 它的编码长度,再把每个字符结果加起来)的值为( )。 2分
登录后查看选项
10 对n个不同符号进⾏哈夫曼编码。若⽣成的哈夫曼树共有115个结点,则n的值是()。 2分
登录后查看选项
11 关于格雷编码(Gray Code),下列说法正确的是( )。 2分
登录后查看选项
12

给定一棵二叉树,采用广度优先搜索 (BFS) 算法,返回右视图所有节点的值。其中右视图定义为:二叉树的右视图是从树的右侧看过去时可见的节点集合,即右视图中的每个节点都是某一层中最右侧的节点。

struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
};
vector<int> rightSideView(TreeNode* root) {
	unordered_map<int, int> rightmostValueAtDepth;
	int max_depth = -1;
	queue<TreeNode*> nodeQueue;
	queue<int> depthQueue;
	nodeQueue.push(root);
	depthQueue.push(0);
	while (!nodeQueue.empty()) {
		TreeNode* node = nodeQueue.front();
		nodeQueue.pop();
		int depth = depthQueue.front();
		depthQueue.pop();
		if (node != NULL) {
			max_depth = max(max_depth, depth);
			rightmostValueAtDepth[depth] = node->val;
			nodeQueue.push(node->left);
			nodeQueue.push(node->right);
			depthQueue.push(________);
			depthQueue.push(________);
		}
	}
	vector<int> rightView;
	for (int depth = 0; ________; ++depth) {
		rightView.push_back(rightmostValueAtDepth[depth]);
	}
	return rightView;
};
2分
登录后查看选项
13 下列关于树的深度优先搜索(DFS)的说法中,正确的是( )。 2分
登录后查看选项
14

小朋友们去邻里拜年,每个家里有不同数量的糖果。规则是:不能连续进入两个相邻的房子(即不能同时取相邻两家的糖果)。目标是拿到最多糖果。以下是代码实现,请补全横线。

int visit(vector<int>& nums) {
	if (nums.empty()) {
		return 0;
	}
	int size = nums.size();
	if (size == 1) {
		return nums[0];
	}
	vector<int> dp = vector<int>(size, 0);
	dp[0] = nums[0];
	dp[1] = max(nums[0], nums[1]);
	for (int i = 2; i < size; i++) {
		dp[i] = ______; // 在此处填写代码
	}
	return dp[size - 1];
}
2分
登录后查看选项
15 元宵节晚上,小朋友沿着一条发光石板路前进,每次可向前走 1 块或 2 块石板。动态规划定义如下:dp[i] = dp[i - 1] + dp[i - 2] ,下面关于 dp[i] 的含义最合适的是( )。 2分
登录后查看选项
判断题 共10道
16

下面定义了一个表示二维坐标点的类 Point , 并提供了一个带参数的构造函数,但第 ② 行 Point b; 会调用编译器自动生成的默认构造函数,将 b.x 和 b.y 初始化为 0.0,程序可以正常编译运⾏。

class Point {
	public:
		double x, y;
		Point(double px, double py) : x(px), y(py) {}
		void print() {
			cout << "(" << x << ", " << y << ")";
		}
};
int main() {
	Point a(3.0, 4.0); // ①
	Point b; // ②
	a.print();
}
2分
登录后查看选项
17 C++ 中的继承支持单继承和多继承,但子类无法直接访问父类的私有成员。 2分
登录后查看选项
18

对如下结构的树,执行 travel 函数,输出结果是 1 2 3 4 5 。

    1
   / \
  2   3
 / \
4   5

struct Node {
	int val;
	Node *left, *right;
	Node(int v) : val(v), left(nullptr), right(nullptr) {}
};
void travel(Node* root) {
	if (!root) return;
	stack<Node*> s;
	s.push(root);
	while (!s.empty()) {
		Node* cur = s.top();
		s.pop();
		cout << cur->val << " ";
		if (cur->right) s.push(cur->right);
		if (cur->left) s.push(cur->left);
	}
}
2分
登录后查看选项
19 若所有字符出现频率相同,则哈夫曼编码一定会得到完全二叉树。 2分
登录后查看选项
20 哈夫曼编码是一种变长的前缀编码,在解码时不需要额外的分隔符就能唯一还原,这是因为在哈夫曼树中,任何一个字符的叶子结点都不会成为另一个字符结点的祖先。 2分
登录后查看选项
21 在 C++ 中使用一维数组 vector<int> tree 存储按层序遍历的完全二叉树时,若根节点存储在tree[0] ,则对于任意非空节点 tree[i] ,其右孩子(如果存在)必然位于 tree[2 * i + 2] 。 2分
登录后查看选项
22 在 C++ 中使用栈来非递归地实现二叉树的前序遍历时,为了保证遍历顺序正确,在处理完当前结点后,应该先将该结点的左孩子压入栈中,然后再将右孩子压入栈中。 2分
登录后查看选项
23

设二叉树共有n个结点,函数 preorderTraversal 以下代码的时间复杂度为O(n),空间复杂度为O(n)。

struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
};
void preorder(TreeNode *root, vector<int> &res) {
	if (root == nullptr) {
		return;
	}
	res.push_back(root->val);
	preorder(root->left, res);
	preorder(root->right, res);
}
vector<int> preorderTraversal(TreeNode *root) {
	vector<int> res;
	preorder(root, res);
	return res;
};
2分
登录后查看选项
24

下列代码实现了一个0-1背包的一维动态规划代码,内层循环是经典的逆序写法。若将内层循环改成正序遍历(即 for (int j = w[i]; j <= W; j++) ),仍能得到正确答案。

int main() {
	int W = 5;
	int w[] = {2, 3, 4};
	int v[] = {10, 1, 1};
	int n = 3;
	int dp[6] = {0};
	for (int i = 0; i < n; i++) {
		for (int j = W; j >= w[i]; j--) { // ← 逆序!
			dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
		}
	}
	cout << dp[W];
}
2分
登录后查看选项
25 在动态规划问题中,状态空间相同且没有重复计算的情况下,“状态转移方程+递推”与“递归+记忆化搜索”的时间复杂度通常相同。 2分
登录后查看选项
编程题 共2道
26

选数

题目描述

给定两个包含 个整数的数组 a=[a1,...,an] 与 b=[b1,...,bn] 。你需要指定若干下标 p1<...k(1≤k≤n)使得以下条件成立:

  • 1 ≤ pi ≤ n(1 ≤ i ≤ k);
  • pi+1 ≥ pi + bpi(1 ≤ i ≤ k)

你需要在满足以上条件的前提下最大化 Σ(k,i=1),也即最大化数组 a 对应下标的整数之和。

输入

第一行,一个正整数n,表示数组长度。

第二行,n个正整数a1,a2,...,an,表示数组a。

第三行,n个正整数b1,b2,...,bn,表示数组b。

输出

一行,一个整数,表示在满足下标条件的前提下,数组a对应下标的整数之和的最大值。

数据范围

对于所有测试点,保证2≤n≤10^5,0≤ai≤10^9,0≤bi≤n

输入样例1

4

1 2 3 4

3 3 1 1

输出样例1

7

输入样例2

6

1 1 4 5 1 4

1 2 3 2 1 0

输出样例2

11

25分
登录后作答
27

完全二叉树

题目描述

给定一棵包含 n 个结点的有根二叉树,结点依次以 1,2,3,...,n 编号,根结点编号为 1。

对于结点 i,其左儿子的编号记为 li,右儿子编号记为 ri。特别地,如果左儿子不存在则 li=0,如果右儿子不存在则 ri=0。

树中每个结点都对应一棵以其为根的子树。请你求出给定有根树的所有 n 棵子树中,有多少棵子树是完全二叉树。

输入

第一行,一个正整数n,表示有根二叉树结点数量。

接下来 n 行,每行两个正整数 li,ri,表示结点 i 的左儿子编号和右儿子编号。

输出

输出一行,一个整数,表示所有子树中完全二叉树的数量。

数据范围

对于所有测试点,保证1≤n≤10^5

输入样例1

4

2 3

4 0

0 0

0 0

输出样例1

4

输入样例2

4

2 3

0 0

4 0

0 0

输出样例2

3

25分
登录后作答