/*-------------------------------------------------------------------*/ | --author : zhangdy | | --date : 2010-08-17 | | --note: | | 循环移位 ,将一个n元一维向量向左旋转i个位置。例如:当n=8,i=3时, | | 向量abcdefgh旋转为defghabc ,你能否仅使用数十个额外的字节存储空间 | | ,在正比于n的时间内完成向量的旋转? | | 分析:旋转向量其实就是交换向量ab的两段得到向量ba,我们可以将问题 | | 看做是把数组ab转换成ba,同时假设我们有一个可以将数组中特定部分的 | | 元素求逆的函数。从ab开始,先将a求逆,得到r(a)b,然后对b求逆,得到 | | r(a)r(b),然后整体求逆得到r(r(a)r(b)).此时恰好是ba。 | /*-------------------------------------------------------------------*/ #include<stdio.h> #include<stdlib.h> void reverse(char * a,int i,int j) { while(j>i) { a[i]=a[i]+a[j]; a[j]=a[i]-a[j]; a[i]=a[i]-a[j]; i++; j--; } } void CyclicShift(char * a,int i,int n) { reverse(a,0,i-1); reverse(a,i,n-1); reverse(a,0,n-1); } int main() { char a[] = "abcdefghijklmn"; CyclicShift(a,3,sizeof(a)-1); puts(a); system("pause"); return 0; }