题目要求:
旋转数组;给定一个数组,旋转K次,要求输出旋转后的数组;(旋转K次即将所有元素移动K次)。
例如:int [] num={1,2,3,4,5,6};向右旋转K=3;
输出:int [] num={4,5,6,1,2,3};
解释:
向右旋转一次即将所元素向右移动一次;所以向右旋转K次就为向右移动K次。
方法一:
计算每个元素移动K次对应的位置:
代码如下:
import java.util.Arrays;
public class XuanZhuan {
public static void main(String[] args) {
XuanZhuan xz = new XuanZhuan();
int [] a= {1,2,3,4,5,6};
xz.show(a,3);
}
public void show(int[] a, int k) {
int n=a.length; //求数组长度
if (k>n) { //当右移次数大于数组长度,取模后的只为新的要移动的次数
k=k%n;
}
int[] b=new int[n];
b=Arrays.copyOf(a, n); //复制一个相同数组
for (int i = 0; i < n; i++) { //每个数都循环移动k个数
int p=(i+k)%n;
a[p]=b[i];
}
for (int x:a) { //输出可不写,仅为自己查看结果
System.out.print(x);
}
}
}
方法二:
暴力旋转发;利用循环将每个元素以每次旋转一位,进行K次旋转;比较费时间;
代码如下:
public class XuanZhuan2 {
public static void main(String[] args) {
XuanZhuan xz = new XuanZhuan();
int [] a= {1,2,3,4,5,6};
xz.show(a,3);
}
public void show(int[] a, int k) {
int n=a.length;
if (k>n) {
k=k%n;
}
for (int i = 1; i <k; i++) { //进行k次循环,每次向右移动一位
int temp=a[n-1];
for (int j = n-2; j >=0; j--) {
a[j+1]=a[j];//每个元素一次向右移动一位
}
a[0]=temp;
}
for (int x:a) {
System.out.println(x);
}
}
}