您的位置:首页 > 编程语言

向量旋转算法《编程珠玑》第二章笔记

2017-07-04 16:09 316 查看
只需要公约数趟for循环便可以旋转完毕。

如果是rotdist=2,i=0那么交换依次就是2,4,6,所以需要第二次i=1,依次交换3,5,7便可

如果是rotdist=3,i=0,交换3,6,然后就是9因为大于总数8,所以从9-8=1继续交换,依次是1,4,7,之后的10大于8所以从10-8=2继续开始依次是2,5 结束。

记录的不太清楚,下面是代码实现。

public static void main(String[] args) {
System.out.println(rotate(new char[]{'a','b','c','d','e','f','g','h'},3));
}
//左旋转rotdist位置
public static char[] rotate(char[] x,int rotdist){
for(int i=0;i<gcd(rotdist,x.length);i++){
char temp=x[i];
int j=i;
while(true){
int k=j+rotdist;
if(k>=x.length)
k -= x.length;
if( k == i)
break;
x[j] = x[k];
j=k;
System.out.println(x);
}
x[j]=temp;
}
return x;
}
//求最大公约数
public static int  gcd(int i,int j){
while( i !=j){
if(i>j) i-=j;
else j-=i;
}
return i;
}


还有一种方法:

public static char[] reverse(char[] x,int a,int b){
char temp;
while(a<b){
temp=x[a];
x[a]=x[b];
x[b]=temp;
a++;
b--;
}
return x;
}
public static void main(String[] args) {
char[] x = new char[]{'a','b','c','d','e','f','g','h'};
int rot=3,n=x.length;
x=reverse(x,0,rot-1);
x=reverse(x,rot,n-1);
x=reverse(x,0,n-1);
System.out.println(x);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: