Java – 旋转数组

因此,目标是将arrays中的元素旋转一次。 举个例子; 如果a==2 ,则array = {0,1,2,3,4}将变为array = {3,4,0,1,2}

这就是我所拥有的:

 for (int x = 0; x <= array.length-1; x++){ array[x+a] = array[x]; } 

但是,这不能解释何时[x+a]大于数组的长度。 我读到我应该存储那些在不同数组中更大的数据但是看作是变量的我不确定这是最好的解决方案。 提前致谢。

在代码中添加模数组长度:

 // create a newArray before of the same size as array // copy for(int x = 0; x <= array.length-1; x++){ newArray[(x+a) % array.length ] = array[x]; } 

您还应该创建一个要复制到的新Array ,这样就不会覆盖以后需要的值。

如果你不想重新发明轮子(也许这是一个练习,但它可以很好地知道),你可以使用Collections.rotate

请注意,它需要一个对象数组,而不是原始数据类型(否则您将在列表中交换数组)。

 Integer[] arr = {0,1,2,3,4}; Collections.rotate(Arrays.asList(arr), 2); System.out.println(Arrays.toString(arr)); //[3, 4, 0, 1, 2] 

Arraycopy是一项昂贵的操作,包括时间和内存。 这将是一种有效的方式来旋转数组而不使用额外的空间,如接受的答案。

 public void rotate(int[] nums, int k) { // k = 2 k %= nums.length; // {0,1,2,3,4} reverse(nums, 0, nums.length - 1); // Reverse the whole Array // {4,3,2,1,0} reverse(nums, 0, k - 1); // Reverse first part (4,3 -> 3,4) // {3,4,2,1,0} reverse(nums, k, nums.length - 1); //Reverse second part (2,1,0 -> 0,1,2) // {3,4,0,1,2} } public void reverse(int[] nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } 

另一种方法是使用System.arraycopy进行复制。

  int[] temp = new int[array.length]; System.arraycopy(array, 0, temp, a, array.length - a); System.arraycopy(array, array.length-a, temp, 0, a); 

我认为最快的方法是使用System.arrayCopy()这是本机方法:

 int[] tmp = new int[a]; System.arraycopy(array, array.length - a, tmp, 0, a); System.arraycopy(array, 0, array, a, array.length - a); System.arraycopy(tmp, 0, array, 0, a); 

它还重用现有的数组。 在某些情况下这可能是有益的。 最后一个好处是临时数组大小小于原始数组。 因此,当a很小时,您可以减少内存使用量。

包含在方法中的Java解决方案:

 public static int[] rotate(final int[] array, final int rIndex) { if (array == null || array.length <= 1) { return new int[0]; } final int[] result = new int[array.length]; final int arrayLength = array.length; for (int i = 0; i < arrayLength; i++) { int nIndex = (i + rIndex) % arrayLength; result[nIndex] = array[i]; } return result; } 

对于左旋转它非常简单

取数组长度和要移位的位置数之间的差异。

例如

 int k = 2; int n = 5; int diff = n - k; int[] array = {1, 2, 3, 4, 5}; int[] result = new int[array.length]; System.arraycopy(array, 0, result, diff, k); System.arraycopy(array, k, result, 0, diff); 

//打印输出

问题: https : //www.hackerrank.com/challenges/ctci-array-left-rotation
解决方案:这是我尝试使用复杂度为o(n)的arrayLeftRotation方法的方法

  • 从k索引到(length-1)循环一次
  • 0到第k个索引的第2次

    public static int [] arrayLeftRotation(int [] a,int n,int k){
    int [] resultArray = new int [n];
    int arrayIndex = 0;
    //将在此循环中填充第一个nk索引
    for(int i = k; i resultArray [arrayIndex] = a [i];
    arrayIndex ++;
    }
    //将在此循环中填充第二个k索引
    for(int j = arrayIndex; j <(arrayIndex + k); j ++){
    resultArray [J] = A [J-(NK)];
    }
    return resultArray;
    }

 package com.array.orderstatistics; import java.util.Scanner; public class ArrayRotation { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int r = scan.nextInt(); int[] a = new int[n]; int[] b = new int[n]; for (int i = 0; i < n; i++) { a[i] = scan.nextInt(); } scan.close(); if (r % n == 0) { printOriginalArray(a); } else { r = r % n; for (int i = 0; i < n; i++) { b[i] = a[(i + r) < n ? (i + r) : ((i + r) - n)]; System.out.print(b[i] + " "); } } } private static void printOriginalArray(int[] a) { for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } } 

ruby中,可以在一行中旋转arrays。

 def array_rotate(arr) i, j = arr.length - 1, 0 arr[j],arr[i], i, j = arr[i], arr[j], i - 1, j + 1 while(j 

问题:给定特定距离旋转arrays。 方法1:将int数组转换为ArrayList。 然后使用Collections.rotate(list,distance)。

 class test1 { public static void main(String[] args) { int[] a = { 1, 2, 3, 4, 5, 6 }; List list = Arrays.stream(a).boxed().collect(Collectors.toList()); Collections.rotate(list, 3); System.out.println(list);//[4, 5, 6, 1, 2, 3] }// main }