运行下列代码,屏幕上输出( )。
1 #include <iostream> 2 using namespace std; 3 4 class my_class { 5 public: 6 static int count; 7 my_class() { 8 count++; 9 } 10 ~my_class() { 11 count--; 12 } 13 static void print_count() { 14 cout << count << " "; 15 } 16 }; 17 int my_class::count = 0; 18 int main() { 19 my_class obj1; 20 my_class::print_count(); 21 my_class obj2; 22 obj2.print_count(); 23 my_class obj3; 24 obj3.print_count(); 25 return 0; 26 }
运行下列代码,屏幕上输出( )。
1 #include <iostream> 2 using namespace std; 3 4 class shape { 5 protected: 6 int width, height; 7 public: 8 shape(int a = 0, int b = 0) { 9 width = a; 10 height = b; 11 } 12 virtual int area() { 13 cout << "parent class area: " <<endl; 14 return 0; 15 } 16 }; 17 18 class rectangle: public shape { 19 public: 20 rectangle(int a = 0, int b = 0) : shape(a, b) { } 21 22 int area () { 23 cout << "rectangle area: "; 24 return (width * height); 25 } 26 }; 27 28 class triangle: public shape { 29 public: 30 triangle(int a = 0, int b = 0) : shape(a, b) { } 31 32 int area () { 33 cout << "triangle area: "; 34 return (width * height / 2); 35 } 36 }; 37 38 int main() { 39 shape *pshape; 40 rectangle rec(10, 7); 41 triangle tri(10, 5); 42 43 pshape = &rec; 44 pshape->area(); 45 46 pshape = &tri; 47 pshape->area(); 48 return 0; 49 }
要实现将一个输入的十进制正整数转化为二进制表示,下面横线上应填入的代码为( )。
1 #include <iostream> 2 using namespace std; 3 4 stack<int> ten2bin(int n) { 5 stack<int> st; 6 int r, m; 7 8 r = n % 2; 9 m = n / 2; 10 st.push(r); 11 12 while (m != 1) { 13 r = m % 2; 14 st.push(r); 15 m = m / 2; 16 } 17 st.push(m); 18 return st; 19 } 20 21 int main() { 22 int n; 23 cin >> n; 24 stack<int> bin; 25 bin = ten2bin(n); 26 while (!bin.empty()) { 27 _____________________ // 在此处填入代码 28 } 29 return 0; 30 }
下面定义了一个循环队列的类,请补全判断队列是否满的函数,横向上应填写( )。
1 #include <iostream> 2 3 using namespace std; 4 5 class circular_queue { 6 private: 7 int *arr; // 数组用于存储队列元素 8 int capacity; // 队列容量 9 int front; // 队头指针 10 int rear; // 队尾指针 11 12 public: 13 circular_queue(int size) { 14 capacity = size + 1; // 为了避免队列满时与队列空时指针相等的情况,多预留一个空间 15 arr = new int[capacity]; 16 front = 0; 17 rear = 0; 18 } 19 20 ~circular_queue() { 21 delete[] arr; 22 } 23 24 bool is_empty() { 25 return front == rear; 26 } 27 28 bool is_full() { 29 ________________ // 在此处填入代码 30 } 31 32 void en_queue(int data) { 33 if (is_full()) { 34 cout << "队列已满,无法入队!" << endl; 35 return -1; 36 } 37 arr[rear] = data; 38 rear = (rear + 1) % capacity; 39 return 1; 40 } 41 42 int de_queue() { 43 if (is_empty()) { 44 cout << "队列为空,无法出队!" << endl; 45 return -1; // 出队失败,返回一个特殊值 46 } 47 int data = arr[front]; 48 front = (front + 1) % capacity; 49 return data; 50 } 51 };
10
20
25
30
31
32
33
16
在求解最优化问题时,动态规划常常涉及到两个重要性质,即最优子结构和( )
青蛙每次能跳1或2步,下面代码计算青蛙跳到第n步台阶有多少种不同跳法。则下列说法,错误的是( )。
1 int jump_recur(int n) { 2 if (n == 1) return 1; 3 if (n == 2) return 2; 4 return jump_recur(n - 1) + jump_recur(n - 2); 5 } 6 7 int jump_dp(int n) { 8 vector<int> dp(n + 1); // 创建一个动态规划数组,用于保存已计算的值 9 // 初始化前两个数 10 dp[1] = 1; 11 dp[2] = 2; 12 // 从第三个数开始计算斐波那契数列 13 for (int i = 3; i <= n; ++i) { 14 dp[i] = dp[i - 1] + dp[i - 2]; 15 } 16 return dp[n]; 17 }
阅读以下二叉树的广度优先搜索代码:
1 #include <iostream> 2 #include <queue> 3 4 using namespace std; 5 6 // 二叉树节点的定义 7 struct TreeNode { 8 int val; 9 TreeNode* left; 10 TreeNode* right; 11 TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 12 }; 13 14 // 宽度优先搜索(BFS)迭代实现 15 TreeNode* bfs(TreeNode* root, int a) { 16 if (root == nullptr) return nullptr; 17 18 queue<TreeNode*> q; 19 q.push(root); 20 21 while (!q.empty()) { 22 TreeNode* node = q.front(); 23 q.pop(); 24 25 if (node->val == a) 26 return node; 27 28 cout << node->val << " "; // 先访问当前节点 29 30 if (node->left) q.push(node->left); // 将左子节点入队 31 if (node->right) q.push(node->right); // 将右子节点入队 32 } 33 return nullptr; 34 }
使用以上算法,在以下这棵树搜索数值20时,可能的输出是( )。
同上题中的二叉树,阅读以下二叉树的深度优先搜索代码:
1 #include <iostream> 2 #include <stack> 3 4 using namespace std; 5 6 // 非递归深度优先搜索(DFS) 7 TreeNode* dfs(TreeNode* root, int a) { 8 if (root == nullptr) return nullptr; 9 10 stack<TreeNode*> stk; 11 stk.push(root); 12 13 while (!stk.empty()) { 14 TreeNode* node = stk.top(); 15 stk.pop(); 16 if (node->val == a) 17 return node; 18 19 cout << node->val << " "; // 访问当前节点 20 21 if (node->right) stk.push(node->right); // 先压入右子节点 22 if (node->left) stk.push(node->left); // 再压入左子节点 23 } 24 return nullptr; 25 }使用以上算法,在二叉树搜索数值20时,可能的输出是( )。
2
3
4
5
C++中类内部可以嵌套定义类。
3.1 编程题 1
试题名称:计算得分
时间限制:1.0 s
内存限制:512.0 MB
3.1.1 题面描述
小杨想要计算由m个小写字母组成的字符串的得分。
小杨设置了一个包含n个正整数的计分序列A=[a1,a2…,an],如果字符串的一个子串由k (1≤k≤n) 个 abc 首尾相接组成,那么能够得到分数ak,并且字符串包含的字符不能够重复计算得分,整个字符串的得分是计分子串的总和。
例如,假设n=3 ,字符串 dabcabcabcabzabc 的所有可能计分方式如下: ▪d+abc+abcabc+abz+abc 或者 d+abcabc+abc+abz+abc,其中 d 和 abz 不计算得分,总得分为a1+a2+a1
▪d+abc+abc+abc+abz+abc,总得分为a1+a1+a1+a1
▪d+abcabcabc+abz+abc,总得分为a3+a1
小杨想知道对于给定的字符串,最大总得分是多少。
3.1.2 输入格式
第一行包含一个正整数n,代表计分序列A的长度。
第二行包含n个正整数,代表计分序列A。
第三行包含一个正整数m,代表字符串的长度。
第四行包含一个由m个小写字母组成的字符串。
3.1.3 输出格式
输出一个整数,代表给定字符串的最大总得分。
3.1.4 样例1
3.1.5 样例解释
最优的计分方式为 d+abc+abc+abc+abz,总得分为a1+a1+a1,共9分。
3.1.6 数据范围
对于全部数据,保证有1≤n≤20,1≤m≤105,1≤ai≤1000。
3.2 编程题 2
试题名称:二叉树
时间限制:1.0 s
内存限制:512.0 MB
3.2.1 题面描述
小杨有一棵包含n个节点的二叉树,且根节点的编号为1。这棵二叉树任意一个节点要么是白色,要么是黑色。之后小杨会对这棵二叉树进行q次操作,每次小杨会选择一个节点,将以这个节点为根的子树内所有节点的颜色反转,即黑色变成白色,白色变成黑色。
小杨想知道q次操作全部完成之后每个节点的颜色。
3.2.2 输入格式
第一行一个正整数n,表示二叉树的节点数量。
第二行n-1个正整数,第i(1≤i≤n-1)个数表示编号为i+1的节点的父亲节点编号,数据保证是一棵二叉树。
第三行一个长度为n的01串,从左到右第i(1≤i≤n)位如果为0,表示编号为i的节点颜色为白色,否则为黑色。
第四行一个正整数q,表示操作次数。
接下来q行每行一个正整数a_i(1≤a_i≤n),表示第i次操作选择的节点编号。
3.2.3 输出格式
输出一行一个长度为n的01串,表示q次操作全部完成之后每个节点的颜色。从左到右第i(1≤i≤n ) 位如果为0,表示编号为i的节点颜色为白色,否则为黑色。
3.2.4 样例1
3.2.5 样例解释
第一次操作后,节点颜色为:011010
第二次操作后,节点颜色为:000000
第三次操作后,节点颜色为:010000
3.2.6 数据范围
对于全部数据,保证有1≤n,q≤105。