将数组向右而不是向左旋转
Posted
技术标签:
【中文标题】将数组向右而不是向左旋转【英文标题】:Rotate array to right instead of left 【发布时间】:2018-02-25 03:54:21 【问题描述】:我有一些将数字数组向左旋转的代码,但我需要它来将其向右旋转。网上还有其他代码可以将数组向右旋转,但该代码只允许您旋转数组中间的数字。
我尝试以不同的方式减少循环并更改其初始化位置,但似乎没有以正确的方式旋转。
预期输出:如果数组是 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;
【问题讨论】:
从您的问题中不清楚您提供的代码是您的工作向左旋转代码(在这种情况下,它几乎没有相关性),还是您没有工作的向右旋转尝试'懒得改名。您还可以准确解释您的尝试出了什么问题:它从输入中产生什么输出,您期望什么,以及您不了解如何从一个到另一个。 您是否排除只使用std::rotate
?
【参考方案1】:
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;
【讨论】:
非常感谢希思和超级。我几乎让它工作了,但在你的帮助下,我让它完全工作了!我似乎无法弄清楚如何指定不同的起点。例如原始数组是 1, 2, 3, 4, 5, 6, 7。然后它应该看起来像。 1, 7, 2, 3, 4, 5, 6 我必须做什么才能让它从 2 开始?我已尝试更改 i 等于但似乎不起作用。 很好@super。所以你不想在轮换中包含第一个元素?只是不要让索引达到 0。所以使用i>1
和arr[1]
。
哦,这很有意义@Heath。再次感谢你!这很有帮助。我希望投票不会因为我的问题已经解决而一直为负。以上是关于将数组向右而不是向左旋转的主要内容,如果未能解决你的问题,请参考以下文章
UIButtons 在向右旋转时起作用,但在向左旋转时不起作用。嗯?