将数组向右而不是向左旋转
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
是这里的关键函数。其他的可以保持不变。看看它在做什么,最好用笔和纸来跟踪操作:
- 保留第一个元素的副本。
- 将所有元素移动到 "left"(即,移动到具有索引的元素
少一个),小心不要覆盖你以后需要的任何东西。
- 将第一个元素放在最后。
所以你需要做相反的事情:
- 保留最后一个元素的副本。
- 将所有元素移动到 "right"(即,移动到具有索引的元素
一个),小心不要覆盖你以后需要的任何东西。
- 将最后一个元素放在首位。
例如:
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;
}
我有一些代码可以将数字数组向左旋转,但我需要它向右旋转。网上还有其他代码可以将数组向右旋转,但该代码只允许您旋转数组中间的数字。
我试过以不同的方式递减循环并更改其初始化位置,但似乎没有以正确的方式旋转。
预期输出:如果数组是这个 {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
是这里的关键函数。其他的可以保持不变。看看它在做什么,最好用笔和纸来跟踪操作:
- 保留第一个元素的副本。
- 将所有元素移动到 "left"(即,移动到具有索引的元素 少一个),小心不要覆盖你以后需要的任何东西。
- 将第一个元素放在最后。
所以你需要做相反的事情:
- 保留最后一个元素的副本。
- 将所有元素移动到 "right"(即,移动到具有索引的元素 一个),小心不要覆盖你以后需要的任何东西。
- 将最后一个元素放在首位。
例如:
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;
}