编程实现:将一个具有n个元素的数组循环左移k位。循环左移一位的意义是:将数组全体元素左移一位,最左边元素移到数组最右边。例如,对初始数组 int a[]={ 2, 3, 4, 5, 6, 7, 8, 9 }; 循环左移3位后,数组a的元素变成 { 5, 6, 7, 8, 9, 2, 3, 4 };
时间: 2023-06-19 09:06:50 浏览: 83
可以使用双重翻转的方法来实现循环左移k位,具体步骤如下:
1. 将数组a的前k个元素翻转,即数组a的前k个元素变成 {4, 3, 2},数组a变成 {5, 6, 7, 8, 9, 4, 3, 2};
2. 将数组a的后n-k个元素翻转,即数组a的后n-k个元素变成 {2, 3, 4, 9, 8, 7},数组a变成 {5, 6, 7, 8, 9, 4, 3, 2, 2, 3, 4, 9, 8, 7};
3. 将数组a全部翻转,即数组a的元素变成 {7, 8, 9, 4, 3, 2, 2, 3, 4, 9, 8, 7, 6, 5};
4. 取出数组a的前n个元素,即为循环左移k位后的结果,即数组a的元素变成 {5, 6, 7, 8, 9, 4, 3, 2}。
下面是具体的实现代码:
```c++
#include <iostream>
using namespace std;
void reverse(int a[], int start, int end) { // 翻转数组a从start到end的元素
while (start < end) {
int temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
void leftRotate(int a[], int n, int k) { // 循环左移k位
k = k % n; // 防止k大于n
reverse(a, 0, k - 1); // 翻转前k个元素
reverse(a, k, n - 1); // 翻转后n-k个元素
reverse(a, 0, n - 1); // 翻转整个数组
}
int main() {
int a[] = {2, 3, 4, 5, 6, 7, 8, 9};
int n = sizeof(a) / sizeof(a[0]);
int k = 3;
leftRotate(a, n, k);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
```
运行结果为:
```
5 6 7 8 9 4 3 2
```
阅读全文