旋转阵列向右而不是向左
Rotate array to right instead of left
我有一些代码,可以向左旋转一个数字数组,但是我需要将其旋转向右侧。还有其他在线代码可以向右旋转数组,但是该代码只能在数组中间旋转数字。
我尝试以不同的方式减少循环&并更改其初始化的位置,但似乎没有以正确的方式旋转。
预期输出:如果数组是此{1, 2, 3, 4, 5, 6, 7}
。然后应该看起来像: {7, 1, 2, 3, 4, 5, 6}
当前输出:{2, 3, 4, 5, 6, 7, 1}
#include <iostream>
using namespace std;
/*Function to left Rotate arr[] of size n by 1*/
void leftRotatebyOne(int arr[], int n);
/*Function to left rotate arr[] of size n by d*/
void leftRotate(int arr[], int d, int n)
{
int i;
for (i = 0; i < d; i++)
leftRotatebyOne(arr, n);
}
void leftRotatebyOne(int arr[], int n)
{
int i, temp;
temp = arr[0];
for (i = 0; i < n-1; i++)
arr[i] = arr[i+1];
arr[i] = temp;
}
/* utility function to print an array */
void printArray(int arr[], int size)
{
int i;
for(i = 0; i < size; i++)
cout << arr[i] << " ";
}
/* Driver program to test above functions */
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7};
printArray(arr, 7);
leftRotate(arr, 1, 7);
cout << "___" << endl;
printArray(arr, 7);
getchar();
return 0;
}
leftRotateByOne
是这里的关键函数。其他人可以保持不变。看看它在做什么,最好用笔和纸来跟踪操作:
- 保留第一个元素的副本。
- 将所有元素移至"左"(即,索引元素少(,注意不要以后覆盖任何您需要的东西。
- 将第一个元素放在最后一个位置。
因此您需要相反:
- 保留最后一个元素的副本。
- 将所有元素移至"右"(即,索引元素再过一个(,请注意不要以后覆盖任何您需要的东西。
- 首先将最后一个元素放在。
例如:
void rightRotatebyOne(int arr[], int n)
{
int i, last;
last = arr[n-1];
for (i = n-1; i > 0; i--)
arr[i] = arr[i-1];
arr[0] = last;
}