将一个具有 n 个元素的数组A[n]向左循环移动k个位置,要求时间复杂度为O(n),空间复杂度为O(1)。写一个这样的代码
时间: 2024-09-17 15:05:31 浏览: 82
数组循环移位操作实例
要实现这个功能,你可以使用C++中的双指针技巧。这里有一个简单的示例代码,它遍历数组两次,一次用于交换前k个元素到正确的位置,另一次用于后移其他元素。
```cpp
#include <iostream>
void leftRotateArray(int arr[], int n, int k) {
// 将数组分为两部分:前k个元素和剩余n-k个元素
for (int i = 0; i < k; ++i) {
// 使用临时变量存储第一个部分的最后一个元素
int temp = arr[i];
// 将第一个部分的元素依次移到第二个部分的末尾
for (int j = i; j < n - k; ++j) {
arr[j] = arr[j + 1];
}
// 将临时变量放入新位置(即原第一个部分的第一个元素)
arr[n - k] = temp;
}
}
// 测试代码
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
leftRotateArray(arr, n, k);
// 输出结果
for (int i : arr) {
std::cout << i << " ";
}
return 0;
}
```
这个代码的时间复杂度是O(n),因为我们只遍历了数组两次,每次遍历都是线性的。空间复杂度是O(1),因为我们只使用了几个额外的变量,没有使用与输入规模成比例的空间。
阅读全文