算法编程题,使用c++语言给出代码、测试过程和运行结果: 将一个具有 n 个元素的数组A[n]向左循环移动k个位置,要求时间复杂度为O(n),空间复杂度为O(1)。
时间: 2024-09-18 14:16:51 浏览: 38
c++-c++编程基础之leetcode题解第18题四数之和.zip
在C++中,你可以使用双指针的方法来解决这个问题,这种方法的时间复杂度和空间复杂度都满足题目要求。下面是一个简单的代码示例:
```cpp
#include <iostream>
void circularShift(int arr[], int n, int k) {
if (n == 0 || k == 0)
return;
// 如果 k > n, 按模运算处理,防止数组越界
k = k % n;
// 使用两个指针,一个固定,一个从右往左移动并替换值
for (int i = 0; i < n - k; i++) {
arr[i] = arr[i + k];
}
// 将剩余部分移到开始
for (int i = n - k; i < n; i++) {
arr[i] = arr[0];
}
}
// 测试代码
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
circularShift(arr, n, k);
std::cout << "Circular Shifted Array:\n";
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
std::cout << "\n";
return 0;
}
```
在这个例子中,我们首先检查 `k` 是否大于 `n`,如果是,则对 `k` 取模以避免数组溢出。然后,我们有两个指针,一个固定在起始位置,另一个从数组右侧开始向左移动,并将当前位置的元素复制到前面。当第一个指针到达数组结束时,我们将剩余的部分直接放到最前面。
测试过程:
假设输入数组 `arr = [1, 2, 3, 4, 5]` 和 `k = 2`,执行上述函数后,数组会变成 `[4, 5, 1, 2, 3]`。
运行结果:
```
Circular Shifted Array:
4 5 1 2 3
```
阅读全文