帮我出一些带答案的oj类C++题目
时间: 2024-12-24 22:31:24 浏览: 7
当然可以!这里提供几个常见的在线编程竞赛(OJ)级别的C++题目,包括答案解析。请注意,这些题目可能需要一定的基础和思维技巧,你可以根据自己的水平选择挑战。
**题目1:两数之和**
- **描述**: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
- **输入示例**:
```cpp
int nums[] = {2, 7, 11, 15}, target = 9;
```
- **输出示例**:
```cpp
[0, 1]
```
- **解答思路**: 使用哈希表查找,时间复杂度为 O(n)。
```cpp
unordered_map<int, int> map;
for (size_t i = 0; i < nums.size(); ++i) {
if (map.find(target - nums[i]) != map.end()) {
return {map[target - nums[i]], i};
}
map[nums[i]] = i;
}
```
**题目2:反转字符串**
- **描述**: 给定一个字符串 s,反转给定字符串前一半,使其变为奇偶交替。
- **输入示例**:
```cpp
string s = "abcdefg";
```
- **输出示例**:
```cpp
"bagcfed"
```
- **解答思路**: 双指针法,分别从头和尾开始遍历,交换字符直到相遇。
```cpp
int n = s.length();
reverse(s.begin(), s.begin() + n / 2);
```
**题目3:最小路径和(二维动态规划)**
- **描述**: 给定一个包含非负整数的 m x n 网格,请找到一条从左上角到右下角的最短路径,每一步只能向下或向右移动,同时避免经过网格中的某些单元格。
- **输入示例**:
```cpp
vector<vector<int>> grid = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}};
```
- **输出示例**:
```cpp
7
```
- **解答思路**: 动态规划,维护一个 dp 数组计算每个位置的最短路径。
```cpp
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> dp(m, vector<int>(n));
dp[0][0] = grid[0][0];
for (int i = 1; i < m; ++i) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int j = 1; j < n; ++j) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
}
```
阅读全文