数组1D在Java中右旋

时间:2018-01-09 16:24:35

标签: java arrays

我希望将数组的元素向右旋转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));
    }

}

2 个答案:

答案 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];
        }