Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的数组1D右旋转_Java_Arrays - Fatal编程技术网

Java中的数组1D右旋转

Java中的数组1D右旋转,java,arrays,Java,Arrays,我希望将数组的元素向右旋转k次(其中k是int),数组的大小为n(int n),您可以在下面看到我的代码,我不确定当数组[n+k]点击[n-1]时如何继续 我试图将a[n-1]环绕成a[0],然后根据需要继续旋转。我知道其他人以不同的方式解决了这个问题,但我要求利用我的代码并调整它如何工作 我的代码: package com.company; //Make an array that rotates n members k times import java.util.Scanner; impo

我希望将数组的元素向右旋转k次(其中k是int),数组的大小为n(int n),您可以在下面看到我的代码,我不确定当数组[n+k]点击[n-1]时如何继续

我试图将a[n-1]环绕成a[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));
    }

}
package.com公司;
//制作一个数组,将n个成员旋转k次
导入java.util.Scanner;
导入java.util.array;
公共类RightRotationArray{
公共静态void main(字符串[]args){
//我想要一个大小为n的数组
int n;
int k;
扫描仪输入=新扫描仪(System.in);
System.out.print(“输入数组的大小:”);
n=input.nextInt();
System.out.print(“在数组中输入一个移位:”);
k=input.nextInt();
//声明数组
int[]数组1=新的int[n];
//现在将元素输入到数组中
对于(int i=0;iimport java.util.array;
公共类移位器{
公共最终静态void main(字符串[]args){
int步数=5;
int[]数组={1,2,3,4,5,6,7,8,9,10};
旋转耳道(阵列、台阶);
流(数组)
.forEach(System.out::println);
//加注时进行换档的替代方法:
数组=新的int[]{1,2,3,4,5,6,7,8,9,10};
int[]newArray=newint[array.length];
for(int i=0;i=0;i--){
数组[i+步数]=数组[i];
}
数组复制(tempArray,0,array,0,steps);
}
}

根据数组的大小和
步骤的值,第一种解决方案可能会导致内存问题。

这里有一个简单的数学方法来旋转数组,请注意,在尝试访问数组之前,您应该始终检查将移位添加到索引中的结果。在您的示例中,您假设可以访问数组1[a+k]并非总是如此。您还需要考虑大于所创建数组长度的移位值,因此%用于确保有效索引

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

循环中的旋转代码应该填充数组。这是有意的吗?我希望旋转在填充过程之后发生。在通过用户输入添加整数之前,请简化您的问题,这将在测试移位逻辑时为您节省大量时间。我建议您不要将用户输入与y混合我们的逻辑/算法。首先获取数据,然后继续计算。这是一条始终可用的一般建议:始终将逻辑、数据和接口分为三个不同的部分blocks@Lothar是的,这是我的初衷,但我只是简单地把它拿了出来,对我的输出没有多大影响。@RAZ_Muh_Taz我同意,谢谢!谢谢!basi也是“是否要制作数组的新副本?”JoshSteier我用第二种解决方案编辑了我的答案。什么是“最佳”取决于具体情况,这个问题没有单一的解决方案。
        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];
        }
Shift = 0 //sanity check
1 6 8 4 9 2 0 -1

Shift = 2
0 -1 1 6 8 4 9 2

Shift = 5
4 9 2 0 -1 1 6 8

Shift = 16 //rotated length*2 so values should remain in their same location
1 6 8 4 9 2 0 -1

Shift = 17
-1 1 6 8 4 9 2 0