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

来源:互联网 发布:淘宝c店女装排行榜 编辑:程序博客网 时间:2024/05/22 01:31

只需要公约数趟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);}



原创粉丝点击