我希望将数组的元素向右旋转k次(其中k是int),数组的大小为n(int n),您可以在下面看到我的代码,I' m当array [n + k]命中[n-1]
时,不确定如何继续我试图将a [n-1]包围为[0],然后根据需要继续旋转。我知道其他人已经以不同的方式解决了这个问题,但我要求使用我的代码并调整它的工作方式。
我的代码:
package com.company;
//Make an array that rotates n members k times
import java.util.Scanner;
import java.util.Arrays;
public class RightRotationArray {
public static void main(String[] args) {
//I want an array with a size n
int n;
int k;
Scanner input = new Scanner(System.in);
System.out.print("Enter a size for the array: ");
n= input.nextInt();
System.out.print("Enter in a shift to the array: ");
k= input.nextInt();
//Declare the array
int[] array1= new int[n];
//now input elements into the array
for(int i=0; i< n; i++){
System.out.print("Enter in a value: ");
array1[i]= input.nextInt();
//want to make the array right rotate so everyone is shifted right
for(int a= 0; a<n-1; a++){
array1[a]= array1[a+k];//shifting step
//need an if to catch the above size declaration
if(array1[a+k]== array1[n-1]){
array1[n-1] = array1[0];
}
}
}
//print out the array to verify
System.out.println(Arrays.toString(array1));
}
}
答案 0 :(得分:1)
import java.util.Arrays;
public class ShiftArray {
public final static void main(String[] args) {
int steps = 5;
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
rotateArray(array, steps);
Arrays.stream(array)
.forEach(System.out::println);
// alternate approach doing the shifring while filling:
array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] newArray = new int[array.length];
for (int i = 0; i < newArray.length; i++) {
int index = (i + steps) % newArray.length;
newArray[index] = array[i];
}
System.out.println("================");
Arrays.stream(newArray)
.forEach(System.out::println);
}
public static void rotateArray(int[] array, int steps) {
int[] tempArray = new int[steps];
System.arraycopy(array, array.length - steps, tempArray, 0, steps);
for (int i = array.length - steps - 1; i >= 0; i--) {
array[i + steps] = array[i];
}
System.arraycopy(tempArray, 0, array, 0, steps);
}
}
根据数组的大小和steps
的值,第一个解决方案可能会导致内存问题。
答案 1 :(得分:1)
这是旋转数组的一个简单的数学运算,请注意,在尝试访问索引之前,应始终检查将转换添加到索引的结果。在您的示例中,您假设您可以访问array1 [a + k],但并非总是如此。您还需要考虑大于所创建数组长度的移位值,因此%用于确保有效索引。
client.get_server('295959610043531264')
输出
int[] array1 = {1,6,8,4,9,2,0,-1};
int[] arrayShifted = new int[array1.length];
int shift = input.nextInt();
for(int i = 0; i < array1.length; i++)
{
if(i + shift < array1.length)
arrayShifted[i+shift] = array1[i];
else
arrayShifted[Math.abs(array1.length - (i + shift))%array1.length] = array1[i];
}