2017-08-01 6 views
0

配列のleftRotationをしようとしています。しかし、コンパイル後に、私はここで配列例外durningコピー配列の配列ローテーション

java.lang.ArrayIndexOutOfBoundsException

を取得しています私のコードです:

public class MyTest{ 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     int n, k; 
     n = sc.nextInt(); 
     k = sc.nextInt(); 
     System.out.print(n+" "+k); 
     int inputArr[] = new int[n]; 
     for(int i=0; i<n; i++){ 
      inputArr[i] = sc.nextInt(); 
     } 

     if(k > inputArr.length) { 
      k=k%inputArr.length; 
     } 

     int[] result = new int[inputArr.length]; 
     System.arraycopy(inputArr, k+1, result, 0, k); 
     System.arraycopy(inputArr, 0, result, k, inputArr.length-1); 

     itemPrint(inputArr); 
     itemPrint(result); 
    } 

    private static void itemPrint(int[] inputArr) { 
     for(int i=0; i<inputArr.length; i++){ 
      System.out.print(inputArr[i]+" "); 
     } 

    } 
} 

ここSystem.arraycopy(inputArr, k+1, result, 0, k);で、私はエラーを取得しています。誰でも私が間違っているところを私に説明することはできますか?

+0

あなたが間違っている点がアルゴリズムの中で最も重要な部分です。プログラミング、アルゴリズム、配列ローテーションを学んでいる場合は、自分でバグを発見した方がより効果的に学習できます – nandsito

答えて

1

System.arraycopy(inputArr, k+1, result, 0, k);は、k+1の要素をk+kからinputArrまでresultにコピーしようとしています。

inputArr(サイズがnの場合)のサイズがlength < k+kの場合は、当然ArrayIndexOutOfBoundsExceptionになります。

1

だけhttps://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)

Javadocを読んで、次のいずれかに該当する場合それ以外の場合は、はIndexOutOfBoundsExceptionがスローされ、宛先は変更されません。 - srcPos引数が負です。 - destPos引数が負です。 - 長さ引数が負です。 - srcPos + lengthがソース配列の長さであるsrc.lengthより大きい - destPos + lengthが宛先配列の長さであるdest.lengthより大きい。

私はつもりはないですが、あなたの全体の溶液を得、私はあなたの過ちから学ぶましょう;のarraycopy機能で)