n数k移动
法一:多开了一个数组
代码:
import java.util.Scanner;
public class ninetythree {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
int k=reader.nextInt();
int[] a=new int[n];int[] b=new int[n];
for(int i=0;i<n;i++) {
a[i]=reader.nextInt();
}
for(int i=0;i<n;i++) {
b[i]=a[(i-1+k)%n];
System.out.printf("%d ",b[i]);
}
}
}
运行结果:
法二:只多开了一个空间
代码:
import java.util.Scanner;
public class onehundred_one {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
int k=reader.nextInt();
int[] a=new int[n];
int temp;
for(int i=0;i<n;i++) {
a[i]=reader.nextInt();
}
for(int i=1;i<=k;i++) {
temp=a[n-1];
for(int j=n-1;j>=1;j--) {
a[j]=a[j-1];
}
a[0]=temp;
}
for(int i=0;i<n;i++) {
System.out.printf("%d ",a[i]);
}
}
}
法三:找出规律了,总是移动最大公因数趟,每趟移动移动n/最大公因数次。
代码:
import java.util.Scanner;
public class onehundred_two {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
int k=reader.nextInt();
int[] a=new int[n];int b0,b1;
for(int i=0;i<n;i++) {
a[i]=reader.nextInt();
}
int m=GREATEST_COMMON_DIVISOR(n,k);
for(int j=0;j<m;j++) {//控制从0和1开始挪的两趟
b0=a[j];
int h=j;
for(int i=0;i<n/m;i++) {//控制挪几次
h=(h+k)%n;
b1=a[h];
a[h]=b0;
b0=b1;
}
}
for(int i=0;i<n;i++) {
System.out.printf("%d ",a[i]);
}
}
public static int GREATEST_COMMON_DIVISOR(int n,int k) {
int a=1;
while((n%k)!=0) {
a=n%k;
n=k;
k=a;
}
return k;
}
}