因为我在java中练习基本的数组问题。关于将n个元素按k单位向左/右旋转,我遇到了问题。
我知道如何处理小元素数组,比如我有一个数组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 :(得分:1)
但是我根本不知道这个方法如何反转阵列?
这不是库实现。你必须自己写。 http://www.example.com/forum/forumdisplay.php?f=148&order=desc&page=3可能有帮助。
为什么我需要使用k%= arr.length;?
如果您有一个包含100个元素的数组,并且需要将其旋转550个位置,则生成的数组将类似于旋转50个元素后得到的数组。你可以通过旋转100个位置,或200个位置,或者通常是k * 100个位置来获得相同的阵列。
答案 1 :(得分: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,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]
是另一种方式。