7. 将一个数组中的数循环左移,例如:数组中原来的数为:1 2 3 4 5,移动后变成2 3 4 5 1.c++
时间: 2024-03-20 14:39:39 浏览: 91
可以先将前n个数翻转,再将后面的数翻转,最后将整个数组翻转即可实现循环左移。以下是C++代码实现:
```cpp
#include <iostream>
using namespace std;
// 翻转数组
void reverse(int arr[], int start, int end) {
while (start < end) {
swap(arr[start], arr[end]);
start++;
end--;
}
}
// 将数组循环左移n位
void leftRotate(int arr[], int n, int k) {
k %= n;
reverse(arr, 0, k - 1);
reverse(arr, k, n - 1);
reverse(arr, 0, n - 1);
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 1;
leftRotate(arr, n, k);
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
```
输出结果为:2 3 4 5 1。
相关问题
c++将一个数组中的数循环左移,例如:数组中原来的数为:1 2 3 4 5,移动后变成2 3 4 5 1
可以通过三次翻转实现将数组循环左移。具体步骤如下:
1. 将整个数组翻转,变成5 4 3 2 1。
2. 将前面k个数翻转,变成4 5 3 2 1。
3. 将后面n-k个数翻转,变成4 5 1 2 3。
其中,k表示左移的位数,n表示数组的长度。最后得到的数组就是循环左移后的结果。
以下是C++实现代码:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
void reverse(int arr[], int start, int end) {
while (start < end) {
swap(arr[start], arr[end]);
start++;
end--;
}
}
void leftRotate(int arr[], int n, int k) {
k %= n; // 处理k大于n的情况
reverse(arr, 0, n-1);
reverse(arr, 0, k-1);
reverse(arr, k, n-1);
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 1;
leftRotate(arr, n, k);
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
```
输出结果为:2 3 4 5 1。
用C语言写代码【问题描述】设将n(n>1)个整数存放在一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(P>0)个位置。 例如,假设P<n,将R中的数据(X0,X1…..Xn-1)循环左移P个位置后,变换为(Xp, XP+1,…..Xn-1,X0,X1……Xp-1) 【输入形式】循环移动的位数,数组中数据的个数,循环前的数组 【输出形式】循环后的数组 【样例输入】3 5 1 2 3 4 5 【样例输出】4 5 1 2 3 【样例说明】请大家注意,循环位移的位数
以下是用C语言编写的解答代码:
```c
#include <stdio.h>
int main() {
int p, n, R[100]; // 定义循环左移的位数、数组中数据的个数和数组R
scanf("%d%d", &p, &n); // 读入循环左移的位数和数组中数据的个数
for (int i = 0; i < n; i++) {
scanf("%d", &R[i]); // 读入数组R
}
int temp[100]; // 定义临时数组,用于存放移动后的数组
for (int i = 0; i < n; i++) {
temp[(i - p + n) % n] = R[i]; // 计算移动后的新位置,并将数据存入临时数组
}
for (int i = 0; i < n; i++) {
printf("%d ", temp[i]); // 输出移动后的数组
}
printf("\n");
return 0;
}
```
代码思路:
首先,定义循环左移的位数 `p`、数组中数据的个数 `n` 和数组 `R`。
使用 `scanf()` 函数读入循环左移的位数和数组中数据的个数,然后使用循环读入数组 `R`。
定义一个临时数组 `temp`,用于存放移动后的数组。
然后,使用循环计算移动后的新位置,并将数据存入临时数组 `temp` 中,公式为 `(i - p + n) % n`,其中 `%` 表示求余数。
最后,使用循环输出移动后的数组。
注意事项:
1. 数组下标从0开始,因此在计算移动后的新位置时,需要将 `i` 减去 `p`,同时加上数组长度 `n`,以保证下标为正数。
2. 在计算新位置时,需要使用取余操作 `%`,以便将下标限定在数组范围内。
3. 在输出数组时,记得在每个元素后面添加一个空格,并在最后一个元素后面添加一个换行符 `\n`。
阅读全文