向量旋转算法《编程珠玑》第二章笔记
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 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;
}
如果是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); }
相关文章推荐
- 编程珠玑(2)第二章学习笔记
- 编程珠玑--------第二章习题笔记
- 学习笔记:候捷深入浅出MFC第二章
- Win32学习笔记 第二章
- Pro visua 4000 l c++/cli and .net 2.0 platform2 学习笔记(6 第二章 C++/CLI基础=1 )
- 计算机网络笔记第二章 应用层tcpip primer plus 第十五章
- 《数据库设计入门经典》之第二章笔记
- XML学习笔记-第二章 XML文档
- 《COM原理及应用》学习笔记之第二章
- C++学习笔记-第二章习题(二)
- C++学习笔记——第二章习题(四)-用循环语句打印图案
- Win32学习笔记 第二章 Unicode
- [原创]Pro Hibernate 3笔记和小结(4)之第二章集成配置Hibernate
- 学生笔记(Oracle第二章)
- CCNA 笔记 第二章
- [原创]Pro Hibernate 3笔记和小结(5)之第二章集成配置Hibernate
- "系统化思维导论"读后的思考与笔记-第二章-方法
- The C++ Programming Language Special 3rd Edition学习笔记-[3]第二章 C++概览
- 设计模式笔记(第二章 GRASP模式)
- 第二章“一切皆对象”的笔记