5308:[GESP202503七级] 客观题
文件提交:无需freopen
内存限制:128 MB
时间限制:1.000 S
评测方式:文本裁判
金币值:
命题人:
提交:0
解决:0
题目描述
## 一、单选题(每题 2 分,共 30 分)
**第 1 题** 下列哪个选项是C++中的关键字?
- function
- class
- method
- object
**第 2 题** 下面代码输出的是()
```cpp
int main() {
int a = 10;
int *p = &a;
int *&q = p;
*q = 20;
cout << a << endl;
return 0;
}
```
- 1
- 2
- 5
- 10
**第 3 题** 以下代码的输出是什么?
```cpp
int main() {
int a = 5, b = 2;
cout << (a >> b) << endl;
}
```
- 10
- 20
- 地址值
- 编译错误
**第 4 题** 下面代码输出的是()
```cpp
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr + 2;
cout << *p << endl;
return 0;
}
```
- 1
- 2
- 3
- 4
**第 5 题** 下列关于排序的说法,正确的是( )。
- 选择排序是最快的排序算法之一。
- 归并排序通常是稳定的。
- 最差情况,\( n \)个元素做快速排序的时间复杂度为 \( O(n^2) \)。
- 最好情况,\( n \)个元素做插入排序的时间复杂度为 \( O(n) \)。
**第 6 题** 下面关于C++类构造和析构函数的说法,错误的是( )。
- 构造函数不能声明为虚函数。
- 析构函数必须声明为虚函数。
- 类的默认构造函数可以被声明为private。
- 类的析构函数可以被声明为private。
**第 7 题** 下列关于树和图的说法,错误的是( )。
- 树是一种有向无环图,但有向无环图不都是一棵树。
- 如果把树看做有向图,每个节点指向其子节点,则该图是强连通图。
- \( n \)个顶点且连通的无向图,其最小生成树一定包含 \( n-1 \)条边。
- \( n \)个顶点、\( n-1 \)条边的有向图,一定不是强连通的。
**第 8 题** \( 8 \) 是个神奇的数字,因为它是由两个数 \( 2 \) 和 \( 2 \) 拼接而成,而且 \( 2^2 + 2^2 = 8 \)。小杨决定写个程序找找小于 \( N \) 的正整数中共有多少这样神奇的数字。下面程序横线处应填入的是( )。
```cpp
#include
int count_miracle(int N) {
int cnt = 0;
for (int n = 1; n * n < N; n++) {
int n2 = n * n;
std::string s = std::to_string(n2);
for (int i = 1; i < s.length(); i++) {
if (s[i] != '0') {
std::string sl = s.substr(0, i);
std::string sr = s.substr(i);
int nl = std::stoi(sl);
int nr = std::stoi(sr);
if (_________) // 在此处填入选项
cnt++;
}
}
}
return cnt;
}
```
- `nl + nr == n`
- `nl + nr == n2`
- `(nl + nr) * (nl + nr) == n`
- `(nl + nr) ^ 2 == n2`
**第 9 题** 给定一个无向图,图的节点编号从 \( 0 \) 到 \( n-1 \),图的边以邻接表的形式给出。下面的程序使用深度优先搜索(DFS)遍历该图,并输出遍历的节点顺序。横线处应该填入的是()
```cpp
#include
#include
#include
using namespace std;
void DFS(int start, vector>& graph, vector& visited) {
stack s;
s.push(start);
visited[start] = true;
while (!s.empty()) {
int node = s.top();
s.pop();
cout << node << " "; // 输出当前节点
// 遍历邻接节点
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
__________________ __________________
}
}
}
}
```
- `visited[neighbor] = true; s.push(neighbor-1);`
- `visited[neighbor] = true; s.push(neighbor+1);`
- `visited[neighbor] = false; s.push(neighbor);`
- `visited[neighbor] = true; s.push(neighbor);`
**第 10 题** 给定一个整数数组 `nums`,找到其中最长的严格上升子序列的长度。子序列是指从原数组中删除一些元素(或不删除)后,剩余元素保持原有顺序的序列。下面的程序横线处应该填入的是()
```cpp
#include
#include
#include
using namespace std;
int lengthOfLIS(vector& nums) {
int n = nums.size();
if (n == 0) return 0;
vector dp(n, 1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
_________________________
}
}
}
return *max_element(dp.begin(), dp.end());
}
```
- `dp[i] = max(dp[i], dp[j]);`
- `dp[i] = max(dp[i+1], dp[j] + 1);`
- `dp[i] = max(dp[i], dp[j] - 1);`
- `dp[i] = max(dp[i], dp[j] + 1);`
**第 11 题** 给定一个整数数组 `nums`,找到其中最长的严格上升子序列的长度。子序列是指从原数组中删除一些元素(或不删除)后,剩余元素保持原有顺序的序列。该程序的时间复杂度为()
- \( O(n) \)
- \( O(n \log n) \)
- \( O(n^2) \)
- \( O(2^n) \)
**第 12 题** 给定两个无向图 \( G1 \) 和 \( G2 \),判断它们是否同构。图的同构是指两个图的节点可以通过某种重新编号的方式完全匹配,且边的连接关系一致。为了简化问题,假设图的节点编号从 \( 0 \) 到 \( n-1 \),并且图的边以邻接表的形式给出。下面程序中横线处应该给出的是()
```cpp
#include
#include
#include