【思路一】最基本解法:内层循环,循环右移1位,外层循环执行K次。由于前一位覆盖后一位,所以内存循环从后向前移动
【思路二】
翻转方法,三次翻转。[1,2,3,4,5],k=2
第一次倒置整个数组:[5,4,3,2,1]
第二次对左边k个元素倒置:[4,5,3,2,1]
第三次对右边length-k个元素倒置:[4,5,1,2,3]
import java.util.Arrays;
/**
* 数组循环右移K位
*/
public class movek {
//最基本解法:内层循环,循环右移1位,外层循环执行K次
//由于前一位覆盖后一位,所以内存循环从后向前移动
public void move1(int[] arr,int k){
int length=arr.length;
int newk=k%length;
for(int i=0;i<newk;i++){
int tmp=arr[length-1];
for(int j=length-2;j>=0;j--){
arr[j+1]=arr[j];
}
arr[0]=tmp;
}
}
//翻转方法,三次翻转。[1,2,3,4,5],k=2
//第一次倒置整个数组:[5,4,3,2,1]
//第二次对左边k个元素倒置:[4,5,3,2,1]
//第三次对右边length-k个元素倒置:[4,5,1,2,3]
public void move2(int[] arr,int k){
k=k%arr.length;
reverse(arr,1,arr.length);
reverse(arr,1,k);
reverse(arr,k+1,arr.length);
}
//交换数组i和j位置的元素
public static void swap ( int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//倒置数组从start到end位
public void reverse(int[] arr,int start,int end){
int i=start;
int j=end;
while(i<j){
swap(arr,i-1,j-1);
i++;
j--;
}
}
public static void main(String args[]){
movek testmovek=new movek();
int[] arr={1,2,3,4,5};
//testmovek.reverse(arr,1,5);
testmovek.move2(arr,6);
System.out.println(Arrays.toString(arr));
}
}