1.题目要求:给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
[1,2,3,4,] 右旋两个位置 得到 [3,4,1,2]
[1,2,3,4,] 右旋五个位置 得到 [4,1,2,3]
1.方法一:
设计一个旋转一次的方法,要求几次就循环几次
方法实现:
//1.写一个逆序的方法
public static void reverse(int [] arr){
int temp = arr[arr.length-1];
for (int i = arr.length-2; i >= 0 ; i--) {
arr[i+1] = arr[i];
}
arr[0] = temp;
}
2.方法二
上面的方法可以是可以,就是一次一次的转太麻烦,我们还可以一步到位
写一个方法将数组分割后在拼接回去即可
程序实现:
//拼接数组
public static int[] joint(int[] arr1, int[] arr2){
int n = arr1.length+arr2.length;
int []temp = new int[n];
int j = 0;
for (int i = 0; i < arr1.length; i++) {
temp[j] = arr1[i];
j++;
}
for (int i = 0; i < arr2.length; i++) {
temp[j] = arr2[i];
j++;
}
return temp;
}
//分割数组
public static int[] devision(int[] arr,int left, int right){
int n = right-left;
int[] temp = new int[n];
for (int i = 0; i < n; i++) {
temp[i] = arr[left];
left++;
}
return temp;
}
3.方法三
上面的方法二已经很好了,但是需要用到一个辅助的数组空间,那有没有更好的选择呢?
当然是有的,例如[1,2,3,4,5],右旋3次后变成[3,4,5,1,2],有一个特殊的操作方式:
先将要右旋的后三个家伙逆序[1,2,5,4,3],然后将后半段也逆序[2,1,5,4,3],最后整体逆序
[3,4,5,1,2]即可。
这样只需要做数值交换即可,写一个帮我们完成局部逆序方法就好
程序实现:
//数组逆序
public static void reversed(int [] arr,int left,int right){
while (left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}