下列哪个选项是C++中的关键字?
下面代码输出的是()
1 int main() {
2 int a = 5, b = 2;
3 cout << (a >> b) << endl;
4 }以下代码的输出是什么?
1 int main() {
2 int a = 10;
3 int *p = &a;
4 int *&q = p;
5 *q = 20;
6 cout << a << endl;
7 return 0;
8 }下面代码输出的是()
1 int main() {
2 int arr[5] = {1, 2, 3, 4, 5};
3 int *p = arr + 2;
4 cout << *p << endl;
5 return 0;
6 }下列关于排序的说法,正确的是( )。
下面关于C++类构造和析构函数的说法,错误的是( )。
下列关于树和图的说法,错误的是( )。
2025是个神奇的数字,因为它是由两个数20和25拼接而成,而且2025=(20+25)2。小杨决定写个程序找找小于N的正整数中共有多少这样神奇的数字。下面程序横线处应填入的是( )。
1 #include <string>
2 int count_miracle(int N) {
3 int cnt = 0;
4 for (int n = 1; n * n < N; n++) {
5 int n2 = n * n;
6 std::string s = std::to_string(n2);
7 for (int i = 1; i < s.length(); i++)
8 if (s[i] != '0') {
9 std::string sl = s.substr(0, i);
10 std::string sr = s.substr(i);
11 int nl = std::stoi(sl);
12 int nr = std::stoi(sr);
13 if (_________) // 在此处填入选项
14 cnt++;
15 }
16 }
17 return cnt;
18 }给定一个无向图,图的节点编号从0到n-1,图的边以邻接表的形式给出。下面的程序使用深度优先搜索(DFS)遍历该图,并输出遍历的节点顺序。横线处应该填入的是()
1 #include <iostream>
2 #include <vector>
3 #include <stack>
4 using namespace std;
5
6 void DFS(int start, vector<vector<int>>& graph, vector<bool>& visited) {
7 stack<int> s;
8 s.push(start);
9 visited[start] = true;
10
11 while (!s.empty()) {
12 int node = s.top();
13 s.pop();
14 cout << node << " "; // 输出当前节点
15
16 // 遍历邻接节点
17 for (int neighbor : graph[node]) {
18 if (!visited[neighbor]) {
19 __________________
20 __________________
21
22 }
23 }
24 }
25 }
26
27 int main() {
28 int n, m;
29 cin >> n >> m;
30
31 vector<vector<int>> graph(n);
32 for (int i = 0; i < m; i++) {
33 int u, v;
34 cin >> u >> v;
35 graph[u].push_back(v);
36 graph[v].push_back(u);
37 }
38
39
40 vector<bool> visited(n, false);
41
42 // 从节点 0 开始DFS遍历
43 DFS(0, graph, visited);
44
45 return 0;
46 }给定一个整数数组nums,找到其中最长的严格上升子序列的长度。
子序列是指从原数组中删除一些元素(或不删除)后,剩余元素保持原有顺序的序列。
下面的程序横线处应该填入的是()
1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5
6 int lengthOfLIS(vector<int>& nums) {
7 int n = nums.size();
8 if (n == 0) return 0;
9 vector<int> dp(n, 1);
10
11 for (int i = 1; i < n; i++) {
12 for (int j = 0; j < i; j++) {
13 if (nums[i] > nums[j]) {
14 _________________________
15 }
16 }
17 }
18 return *max_element(dp.begin(), dp.end());
19 }
20
21 int main() {
22 int n;
23 cin >> n;
24 vector<int> nums(n);
25 for (int i = 0; i < n; i++) {
26 cin >> nums[i];
27 }
28
29 int result = lengthOfLIS(nums);
30 cout << result << endl;
31
32 return 0;
33 }给定一个整数数组nums,找到其中最长的严格上升子序列的长度。
子序列是指从原数组中删除一些元素(或不删除)后,剩余元素保持原有顺序的序列。
该程序的时间复杂度为()
1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5
6 int lengthOfLIS(vector<int>& nums) {
7 int n = nums.size();
8 if (n == 0) return 0;
9 vector<int> dp(n, 1);
10
11 for (int i = 1; i < n; i++) {
12 for (int j = 0; j < i; j++) {
13 if (nums[i] > nums[j]) {
14 _________________________
15 }
16 }
17 }
18 return *max_element(dp.begin(), dp.end());
19 }
20
21 int main() {
22 int n;
23 cin >> n;
24 vector<int> nums(n);
25 for (int i = 0; i < n; i++) {
26 cin >> nums[i];
27 }
28
29 int result = lengthOfLIS(nums);
30 cout << result << endl;
31
32 return 0;
33 }给定两个无向图
G1和G2 ,判断它们是否同构。图的同构是指两个图的节点可以通过某种重新编号的方式完全匹配,且边的连接关系一致。
为了简化问题,假设图的节点编号从0到n-1,并且图的边以邻接表的形式给出。下面程序中横线处应该给出的是 ()
1 #include <iostream>
2 #include <vector>
3 #include <map>
4 #include <algorithm>
5 using namespace std;
6
7 string graphHash(vector<vector<int>>& graph) {
8 vector<string> nodeHashes(graph.size());
9 for (int i = 0; i < graph.size(); i++) {
10 vector<int> neighbors = graph[i];
11 sort(neighbors.begin(), neighbors.end());
12 string hash;
13 for (int neighbor : neighbors) {
14 ——————————————————————————
15 }
16 nodeHashes[i] = hash;
17 }
18 sort(nodeHashes.begin(), nodeHashes.end());
19 string finalHash;
20 for (string h : nodeHashes) {
21 finalHash += h + ";";
22 }
23 return finalHash;
24 }
25
26 int main() {
27 int n;
28 cin >> n;
29
30 vector<vector<int>> G1(n);
31 for (int i = 0; i < n; i++) {
32 int k;
33 while (cin >> k) {
34 G1[i].push_back(k);
35 if (cin.get() == '\n') break;
36 }
37 }
38
39 vector<vector<int>> G2(n);
40 for (int i = 0; i < n; i++) {
41 int k;
42 while (cin >> k) {
43 G2[i].push_back(k);
44 if (cin.get() == '\n') break;
45 }
46 }
47
48 string hash1 = graphHash(G1);
49 string hash2 = graphHash(G2);
50
51 if (hash1 == hash2) {
52 cout << "YES" << endl;
53 } else {
54 cout << "NO" << endl;
55 }
56
57 return 0;
58 }给定一个m×n的二维网格grid,每个格子中有一个非负整数。请找出一条从左上角 (0, 0) 到右下角 (m-1, n-1) 的路径,使得路径上的数字总和最小。每次只能向右或向下移动。横线处应该填入的是()
1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5
6 int minPathSum(vector<vector<int>>& grid) {
7 int m = grid.size();
8 int n = grid[0].size();
9
10 vector<vector<int>> dp(m, vector<int>(n, 0));
11
12 dp[0][0] = grid[0][0];
13 for (int j = 1; j < n; j++) {
14 dp[0][j] = dp[0][j - 1] + grid[0][j];
15 }
16 for (int i = 1; i < m; i++) {
17 dp[i][0] = dp[i - 1][0] + grid[i][0];
18 }
19 for (int i = 1; i < m; i++) {
20 for (int j = 1; j < n; j++) {
21 ————————————————————————————————
22 }
23 }
24 return dp[m - 1][n - 1];
25 }
26
27 int main() {
28 int m, n;
29 cin >> m >> n;
30 vector<vector<int>> grid(m, vector<int>(n));
31 for (int i = 0; i < m; i++) {
32 for (int j = 0; j < n; j++) {
33 cin >> grid[i][j];
34 }
35 }
36 int result = minPathSum(grid);
37 cout << result << endl;
38
39 return 0;
40 }给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。下面横线处应该填入的是()
1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5
6 int maxSubArray(vector<int>& nums) {
7 int n = nums.size();
8 if (n == 0) return 0;
9
10 vector<int> dp(n, 0);
11 dp[0] = nums[0];
12 int maxSum = dp[0];
13
14 for (int i = 1; i < n; i++) {
15 _____________________________________
16 maxSum = max(maxSum, dp[i]);
17 }
18
19 return maxSum;
20 }
21
22 int main() {
23 int n;
24 cin >> n;
25
26 vector<int> nums(n);
27 for (int i = 0; i < n; i++) {
28 cin >> nums[i];
29 }
30
31 int result = maxSubArray(nums);
32 cout << result << endl;
33
34 return 0;
35 }在哈希表的实现中,冲突解决是一个重要的问题。以下哪种方法不是常见的哈希表冲突解决策略?
在C++语法中,表达式1e6、1000000和10^6的值是相同的。
在C++语言中,函数调用前必须有函数声明或定义。
快速排序一般是不稳定的。
long long类型能表达的数都能使用double类型精确表达。
使用math.h或cmath头文件中的函数,表达式cos(60)的结果类型为double、值约 0.5。
一颗N层的满二叉树,一定有2N-1个结点。
邻接表和邻接矩阵都是图的存储形式。为了操作时间复杂度考虑,同一个图可以同时维护两种存储形式。
子类对象包含父类的所有成员(包括私有成员)。从父类继承的私有成员也是子类的成员,因此子类可以直接访问。
动态规划算法通常有递归实现和递推实现。但由于递归调用在运行时会由于层数过多导致程序崩溃,有些动态规划算法只能用递推实现。
按照下面的规则生成一棵二叉树:以一个人为根节点,其父亲为左子节点,母亲为右子节点。对其父亲、母亲分别用同样规则生成左子树和右子树。以此类推,记录30代的直系家谱,则这是一棵满二叉树。
3.1 编程题 1
时间限制:1.0 s
内存限制:512.0 MB
3.1.1 图上移动
3.1.2 题目描述
小A有一张包含n个结点与m条边的无向图,结点以1,2,…,n标号。小A会从图上选择一个结点作为起点,每一步移动到某个与当前小A所在结点相邻的结点。对于每个结点i(1≤i≤n),小A想知道从结点i出发恰好移动1,2,…,k步之后,小A可能位于哪些结点。由于满足条件的结点可能有很多,你只需要求出这些结点的数量。
3.1.3 输入格式
第一行,三个正整数n,m,k,分别表示无向图的结点数与边数,最多移动的步数。
接下来m行,每行两个正整数ui,ui,表示图中的一条连接结点ui与ui的无向边。
3.1.4 输出格式
共n行,第i行(1≤i≤n)包含k个整数,第j个整数(1≤j≤k)表示从结点i出发恰好移动j步之后可能位于的结点数量。
3.1.5 样例
3.1.5.1 输入样例 1

3.1.5.2 输出样例 1

3.1.6 数据范围
对于20%的测试点,保证k=1。
对于另外20%的测试点,保证1≤n≤50,1≤m≤50。
对于所有测试点,保证1≤n≤500,1≤m≤500,1≤k≤20,1≤ui,ui≤n。
3.2 编程题 2
时间限制:1.0 s
内存限制:512.0 MB
3.2.8 等价消除
3.2.9 题目描述
小A有一个仅包含小写英文字母的字符串S。
对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串是可以被等价消除的。
小A想知道S有多少子串是可以被等价消除的。
一个字符串S'是S的子串,当且仅当删去S的某个可以为空的前缀和某个可以为空的后缀之后,可以得到S'。
3.2.10 输入格式
第一行,一个正整数|S|,表示字符串S的长度。
第二行,一个仅包含小写英文字母的字符串S。
3.2.11 输出格式
一行,一个整数,表示答案。
3.2.12 样例
3.2.12.3 输入样例 1

3.2.12.4 输出样例 1

3.2.12.5 输入样例 2

3.2.12.6 输出样例 2

3.2.13 数据范围
对于20%的测试点,保证S中仅包含a和b两种字符。
对于另外20%的测试点,保证1≤|S|≤2000。
对于所有测试点,保证1≤|S|≤2×105。