2017-04-13 10 views
0

私はjavaで基本的な配列の問題を練習しています。 n個の要素をk単位だけ左右に回転させることに問題がありました。私は100個の以上の要素を持っている場合は、この後Java逆配列方法はどのように機能しますか?

return new int[]{arr[1],arr[2],arr[0]}; 

私は、小さな要素の配列に対処するために、私は、配列int[]arr={1,2,3};を持っているような、私はちょうどこのような要素の位置を切り替えることができます方法を知っていますこの方法では配列はまったく機能しません。だから私は誰かがそれに対処するために逆の方法を使用するのを見た。

public void rotateProblem(int[]arr,int k){ //k means rotate k units to right 
    k%=arr.length; 
    k=2; 
    reverse(arr, 0, arr.length - 1); 
    reverse(arr, 0, k - 1); 
    reverse(arr, k, arr.length - 1); 
} 

しかし、私は全くこのメソッドは、配列を反転んどのようにそれを得ることはありません、そして、なぜ私は誰もが逆の方法私には説明できk%=arr.length;を使用する必要がありますか?

+0

'reverse'メソッドを投稿してください。 –

+0

'k%= arr.length;'はあなたが 'k = 2; 'を持っているので何もしませんが、これはkの大きな値を扱うことが期待されます。 –

答えて

0

Iがとる、この問題をKだけ右に、配列の各要素を回転させるためにleetcode

から転記されたとえば
ステップ、アレイ[1,2,3,4,5,6,7]k = 3ため、[5,6,7,1,2,3,4]に回転されます。

注:配列の要素数よりも大きい大きいkがある可能性があります。
したがって、k = array.lengthとすると、回転した配列は元の配列と等しくなります。
同様に、k = array.length + 1k = 1に相当します。

したがって、不必要な複数の回転を防ぐため、最初のケースでk = k % arr.lengthを実行します。


reverse(arr, 0, arr.length - 1);あなたは、配列の最初のセクションを達成している見たよう[7,6,5,4,3,2,1]
reverse(arr, 0, k - 1);の配列は、4,3,2,1]
[5,6,7で配列をなりますなります。
reverse(arr, k, arr.length - 1);は、配列の最後の部分を達成するのに役立ちます。 [5,6,7,1,2,3,4]

全体として、結果の(回転した)アレイは、[5,6,7,1,2,3,4]となる。


これを達成する方法は複数あります。 len = arr.length

reverseArray(nums, len - k, len - 1); // [1,2,3,4,7,6,5] 
reverseArray(nums, 0, len - k - 1); // [4,3,2,1,7,6,5] 
reverseArray(nums, 0, len - 1);  // [5,6,7,1,2,3,4] 

は別の方法である、と言います。

+0

ありがとうございますが、私はまだreverse()メソッドについての質問があります、なぜあなたは(arr、0、arr.length-1)をこのメソッドに書くのですか? –

+0

右に回転する必要があります。アレイの鏡像を撮ると考えてください。右の要素は自動的に左に向かい、その逆もあります。 –

1

しかし、私はこの方法でどのように配列を逆にするのですか?

これはライブラリの実装ではありません。あなたはそれを自分で書く必要があります。 Thisが役に立ちます。

なぜk%= arr.length;を使用する必要がありますか?

100個の要素の配列があり、それを550個の位置で回転する必要がある場合、結果の配列は50個の要素を回転させた後のものと似ています。あなたは100の位置、または200の位置、または一般的にk * 100の位置でそれを回転することによって同じ配列を得るでしょう。

関連する問題