赞
踩
力扣:189. 旋转数组
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
题目说有三种解法,下面给出的三种解法,比较简单通俗易懂。
第一种暴力法:
public static int[] rotate1(int[] array,int k){
int newK=k%array.length;
int temp=0;
for(int i=0;i<array.length;i++){
//让temp先保存最后一个元素
temp=array[array.length-1];
//进行数组的整个一遍移动过程
for(int j=array.length-2;j>=0;j--){
array[j+1]=array[j];
}
//要将最后的元素放到首位,这样一遍才进行完成
array[0]=temp;
}
return array;
}
暴力方法的另一种,本质上还是相同的。
public static int[] rotate2(int[] array,int k){
int newK=k%array.length;
while(newK>0){
int temp=array[array.length-1];
for(int i=array.length-1;i>0;i--){
array[i]=array[i-1];
}
array[0]=temp;
newK--;
}
return array;
}
第二种方法:利用另一个数组进行辅助,重新计算每一个数字要移动到的位置,放到新的数组中去。
public static int[] rotate(int[] array,int k){
int newK=k%array.length;
int[] newArray=new int[array.length];
for(int i=0;i<array.length;i++){
int newP=(i+newK)%array.length;
newArray[i]=array[newP];
}
return newArray;
}
第三种方法:先整体逆序,在逆序前K个,在逆序后K个
public static void rotate4(int[] arr,int k) { //确定移动次数 k %= arr.length; //将整个数组逆序 reserve(arr,0,arr.length - 1); //将前k个逆序 reserve(arr,0,k-1); //从下标k到数组长度之间逆序 reserve(arr,k,arr.length - 1); } //逆序 public static void reserve(int[] arr,int start,int end) { while(start < end) { int tmp = arr[end]; arr[end--] = arr[start]; arr[start++] = tmp; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。