数组左旋转会导致某些输入错误

时间:2019-06-28 05:25:52

标签: java

我尝试通过蛮力方法使阵列旋转。它适用于某些输入,而对于其他输入则会产生错误。我要去哪里错了?

有效输入:1 2 3 4 5,旋转2个地方

实际输出:3 4 5 1 2

无效输入:1 2 3 4,旋转了2个地方

预期输出:3 4 1 2

实际输出:ArrayIndexOutofBoundsException

代码:

    import java.util.*;

    public class LeftRotation {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter number of elements");
        int len = in.nextInt();
        System.out.println("Enter the elements");
        int[] arr = new int[len];
        for(int i=0; i<len;i++)
        {
            arr[i] = in.nextInt();
        }
        System.out.println("Enter number of times to rotate");
        int k = in.nextInt();
        int[] arr1 = new int[k];
        for(int i=0;i<=k-1;i++)
        {
            arr1[i]=arr[i];
        }

        int[] arr2 = new int[len];
        for(int i=k;i<=len-1;i++)
        {
            if(i+k<=len+1)
            {
                arr2[i-k]=arr[i];
            }
        }

        for(int i=0;i<=k-1;i++)
        {
            if(i+k<=len)
            {
                arr2[i+k+1]=arr1[i];
            }   
        }
        for(int i=0;i<=len-1;i++)
        {
            System.out.println(arr2[i]);
        }
    }

    }

我知道这不是解决此问题的有效方法,但我想获得对此的基本解决方案。

2 个答案:

答案 0 :(得分:1)

这是因为在偶数长度为(i + k + 1)的情况下,arr2的索引超出了长度。

而是通过不同的变量'j'跟踪两个循环中arr2的索引,如下所示:

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter number of elements");
        int len = in.nextInt();
        System.out.println("Enter the elements");
        int[] arr = new int[len];
        for(int i=0; i<len;i++)
        {
            arr[i] = in.nextInt();
        }
        System.out.println("Enter number of times to rotate");
        int k = in.nextInt();
        int[] arr1 = new int[k];
        for(int i=0;i<=k-1;i++)
        {
            arr1[i]=arr[i];
        }

        int[] arr2 = new int[len];
        int j = 0;
        for(int i=k;i<=len-1;i++, j++)
        {
          arr2[j]=arr[i];
        }

        for(int i=0;i<=k-1;i++, j++)
        {
          arr2[j]=arr1[i];  
        }
        for(int i=0;i<=len-1;i++)
        {
            System.out.println(arr2[i]);
        }
    }

}

答案 1 :(得分:1)

请注意,临时变量arr1是无用的:您可以将元素直接从arr复制到arr2

    for(int i=0;i<k;i++)
    {
        arr2[len-k+i]=arr[i];
    }
    for(int i=k;i<len;i++)
    {
        arr2[i-k]=arr[i];
    }