如何将数组向右旋转

6

我已经编写了一个程序来将int数组向左移动,但是找不到一种方法来将其向右移动。您能否看一下我的代码,并在评论中提出任何想法,如何根据空间数量(int x)“旋转”我的数组右侧,因为目前它只向左移动。谢谢。

public void makeRight(int x) {
   int[] anArray = {0, 1, 2, 3, 4, 5};
   int counter = 0;
   while (counter < x) {
        int temp = anArray[0];
        for (int i = 0; i < anArray.length - 1; i++) {
            anArray[i] = anArray[i + 1];
         }

         anArray[anArray.length - 1] = temp;
         counter++;
  }
  for (int i = 0; i < anArray.length; i++){
      System.out.print(anArray[i] + " ");
  }
}

1
它当前向右移动,问题出在哪里? - Andremoniy
9个回答

1

将数组向右旋转

public void makeRight( int x )
{
    int[] anArray =
    { 0, 1, 2, 3, 4, 5 };
    int counter = 0;
    while ( counter < x )
    {
        int temp = anArray[anArray.length - 1];
        for ( int i = anArray.length - 1; i > 0; i-- )
        {
            anArray[i] = anArray[i - 1];
        }
        anArray[0] = temp;
        counter++;
    }
    for ( int i = 0; i < anArray.length; i++ )
    {
        System.out.print( anArray[i] + " " );
    }
}

0
while (counter < x) {
    int temp = anArray[anArray.length - 1];
    for (int i = anArray.length - 1; i > 0; i--) {
        anArray[i] = anArray[i - 1];
    }
    anArray[0] = temp;
    counter++;
}

0

在我看来,你已经完成了大部分旋转数组(向右)的工作。只是这个概念:

anArray[i] = secondArray[(i + x) % anArray.length];

anArray[(i + x) % anArray.length] = secondArray[i];

有点不同。

可能会有类似这样的东西:

    int[] anArray = {0, 1, 2, 3, 4, 5};
    //int counter = 0;
    //int x = 2;
    int[] secondArray = new int[anArray.length];

    for (int i = 0; i < anArray.length; i++) {
        secondArray[(i + x) % anArray.length] = anArray[i];
    }

    for (int i = 0; i < secondArray.length; i++){
        System.out.print(secondArray[i] + " ");
    }

关于"%"的工作原理,Codility - CyclicRotation 这个链接应该有一个清晰的解释。

0
以下函数可以帮助您:
public static void rightRotateArray(int[] a, int requiredIterations) {
  // right-rotate [a] by k moves
  // totalActiveIterations  by MOD 
  // => because every n(a.length) rotations ==> we receive the same array
  int totalActiveIterations = requiredIterations % a.length; 
  for (int i = 0; i < totalActiveIterations; i++) {
   // make lastElement as BKP temp
   int temp = a[a.length - 1];
   // make other elements => each one equal previous one [starting by lastElement]
   for (int j = (a.length - 1); j >= 1; j--) {
    a[j] = a[j - 1];
   }
   // make 1stElement equal to (BKP as temp = lastElement)
   a[0] = temp;
  }
 }

0

最简单的方法是使用C++11及以上版本,在Codility测试中进行循环旋转。 想象一下在早期版本中进行操作,呵呵!

#include <algorithm>
#include <iterator>
vector<int> solution(vector<int> &A, int K) {
 if (A.size() == 0) {
        return A;
    }

    for (int i=0;i<K;i++) {
        //Create auciliary array
        std::vector<int> aux(A.size());
        //copy array to be rotated there by means of C++11
        std::copy(std::begin(A), std::end(A), std::begin(aux));
        //insert last element from aux to begining of the array
        A.insert(A.begin(), aux.end()-1, aux.end());
        //remove last element which is already become first
        A.pop_back();
        
    }
    return A;
   }

0

类似这样的代码应该可以运行

    private void shiftArrayRight() {
        int endElementvalue = element[element - 1];
        int[] startElements = Arrays.copyOfRange(element, 0 , element.length - 1);
        element[0] = endElementvalue;
        for(int i = 0, x = 1; i < startElements.length; i++, x++) {
            element[x] = startElements[i];
        }
        System.out.println(Arrays.toString(element);
    }

0
其他答案只是代码堆,没有任何解释。这里是我想出的一个算法:
我们就地旋转数组。观察到每个元素的目标位置由 (index + k) 模 size 给出。对于范围 0 到 k - 1,只要目标位置大于当前位置,我们就递归交换每个元素与其目标位置上的元素。这是因为由于我们从较低的索引逐步向较高的索引前进,较小的目标索引表示对应的元素已经被交换。
Example:
Rotate [1, 2, 3, 4, 5, 6] by 3

Index to target index:
0 to 3
1 to 4
2 to 5
3 to 0
4 to 1
5 to 2

swap(0, 3) => [4, 2, 3, 1, 5, 6]
swap(0, 0) => return
swap(1, 4) => [4, 5, 3, 1, 2, 6]
swap(1, 1) => return
swap(2, 5) => [4, 2, 6, 1, 2, 3]
swap(2, 2) => return

Done!

Another example:
Rotate [2, 3, 4, 1] by 1

Index to target index:
0 to 1
1 to 2
2 to 3
3 to 0

swap(0, 1) => [3, 2, 4, 1]
swap(0, 2) => [4, 2, 3, 1]
swap(0, 3) => [1, 2, 3, 4]
swap(3, 0) => return

Done!

代码:

static void rotateRight(int[] xs, int k) {
        swap(0, 0, xs, k);
}

private static void swap(int original, int current, int[] xs, int k) {
    int target = (original + k) % xs.length;

    if (target > current) {
        int tmp = xs[current];
        xs[current] = xs[target];
        xs[target] = tmp;

        swap(target, current, xs, k);
    }
}

0
public static List<int> rotateLeft(int d, List<int> arr)
{
    int listSize = arr.Count();
    int[] newArr = new int[listSize];
    
    for(int oldIndex=0; oldIndex< listSize; oldIndex++)
    {
        int newIndex = (oldIndex + (listSize - d))% listSize;
        newArr[newIndex] = arr[oldIndex];
    }
    List<int> newList = new List<int>(newArr);
    return newList;
}

请问您能否解释一下您的代码,并说明为什么问题中的代码是错误的? - Nickofthyme

-1

只需像这样更改代码

public void makeRight(int x) {
int[] anArray = {0, 1, 2, 3, 4, 5};
int counter = 0;
while(counter< x){
       int temp = anArray[anArray.length - 1];
        for (int i = anArray.length - 1; i > 0; i--) {
            anArray[i] = anArray[i - 1];
        }

        anArray[0] = temp;
        counter++;
 }
for (int i = 0; i < anArray.length; i++)
System.out.print(anArray[i] + " ");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接