编程珠玑(二)
将一个具有n个元素的一维向量向左旋转i个位置,n=8,i=3,abcdefgh--defghabc
//将一个具有n个元素的一维向量向左旋转i个位置,n=8,i=3,abcdefgh--defghabc #include <iostream> #include <time.h> using namespace std; //--方法一:先移动一位,然后移动i位即可 void OneStep(char* ch,int n) { char t=ch[0]; for (int i=1;i<n;i++) ch[i-1]=ch[i]; ch[n-1]=t; } void Moveto(char* ch,int n,int i) { i=i%n; for (int j=0;j<i;j++) { OneStep(ch,n); } } //--方法二:先将前面部分存储起来,然后移位并复制 void StoreMove(char* ch,int n, int i) { int j; i%=n; char* tmp=new char[i]; for (j=0;j<i;j++) { tmp[j]=ch[j]; } for (j=i;j<n;j++) { ch[j-i]=ch[j]; } for (j=0;j<i;j++) { ch[n-i+j]=tmp[j]; } } //--方法三:先将ch[0]放入t中,然后隔位移动 void SmallStoreMove(char* ch,int n,int i) { // int j; i%=n; } //--方法四:不停的翻转 void Reverse(char* start, char *end) { char t; while (start<=end) { t=*start; *start=*end; *end=t; start++; end--; } } void ReverseMove(char* ch,int n,int i) { Reverse(ch,ch+i-1); Reverse(ch+i,ch+n-1); Reverse(ch,ch+n-1); } void main() { char ch[]="abcdefgh"; // OneStep(ch,8); // Moveto(ch,8,3); // StoreMove(ch,8,3); // Reverse(ch,ch+4); ReverseMove(ch,8,3); cout<<ch<<endl; }