描述
將一個n元一維向量向左旋轉i個位置。例如,n=8,i=3,向量abcdefgh旋轉結果爲defghabc. 要求是使用數十個額外字節的存儲空間,在正比於n的時間內完成向量的旋轉??
思路
簡答的代碼就是存儲前i個,然後將後面n-i依次向前挪動。這樣的使用的i個額外空間就是過大的存儲空間的消耗。另外一個方法就是遞歸調用,每次旋轉一個,然後調用i次。還一個方法就是按照第i個劃分,分別將兩部分翻轉,然後再將整個向量翻轉。這樣的複雜度是O(n).下面是書上講解的方法的實現,各位可以感受一下:
string reverIth(string& src,int i){
int n = src.size();
if(i>=n)
return src;
char temp;
for(int j=0;j<i;++j){
temp=src[j];
int m=j;
while(m<n-i){
src[m]=src[m+i];
m = m+i;
}
src[n-i+j]=temp;
}
return src;
}
//交換
string reverIth2(string& src,int i){
// cout<<src;
int n = src.size();
int m=0,k=i;
while(m<=(i-1)/2){
int temp = src[m];
src[m]=src[i-1-m];
src[i-1-m]=temp;
++m;
}
//cout<<src;
while(k<=(n+i-1)/2){
int temp = src[k];
src[k]=src[n+i-1-k];
src[n+i-1-k]=temp;
++k;
}
k=0;
while(k<=(n-1)/2){
int temp = src[k];
src[k]=src[n-1-k];
src[n-1-k]=temp;
++k;
}
return src;
}