将数组向右而不是向左旋转

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 是这里的关键函数。其他的可以保持不变。看看它在做什么,最好用笔和纸来跟踪操作:

  1. 保留第一个元素的副本。
  2. 将所有元素移动到 "left"(即,移动到具有索引的元素 少一个),小心不要覆盖你以后需要的任何东西。
  3. 将第一个元素放在最后。

所以你需要做相反的事情:

  1. 保留最后一个元素的副本。
  2. 将所有元素移动到 "right"(即,移动到具有索引的元素 一个),小心不要覆盖你以后需要的任何东西。
  3. 将最后一个元素放在首位。

例如:

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;
}