2017-04-13 61 views
0

因爲我在java中練習基本的數組問題。我有一個關於將n個元素左移/右移k個單位的問題。Java反向數組方法如何工作?

我知道如何對付小的單元陣列,比如我有一個數組int[]arr={1,2,3};我可以切換這樣的元素的位置:

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

在此之後,如果我有100種以上的元素這樣一個數組根本不起作用。所以我看到有人用反向方法來處理它。

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'方法。這不是一個Java內置的。 –

+0

'k%= arr.length;'沒有做任何事情,因爲你有'k = 2;'但是,我期望這是處理大的k值。 –

回答

0

我假定,這個問題是由leetcode

發佈到用k數組的每個元素向右旋轉,用於陣列[1,2,3,4,5,6,7]k = 3,被旋轉以[5,6,7,1,2,3,4]

注意:您可能有大的k(大於數組中元素的數量)。
因此,使用k = array.length時,旋轉的數組將等於原始數組。
同樣,k = array.length + 1相當於k = 1

因此,我們在第一種情況下做k = k % arr.length以防止不必要的多次旋轉。


reverse(arr, 0, arr.length - 1);將導致[7,6,5,4,3,2,1]
reverse(arr, 0, k - 1);陣列將導致在陣列中[5,6,7,4,3,2,1]
正如所看到的你已經達到在陣列的第一部分。
reverse(arr, k, arr.length - 1);將幫助我們實現陣列的最後部分。 [5,6,71,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個位置,您將獲得相同的陣列。步驟
例如