問題描述
請將乙個具有n個元素的一維向量向左旋轉i個位置。例如,假設n=8,i=3,那麼向量abcdefgh旋轉之後得到向量defghabc。簡單編碼使用乙個具有n個元素的中間向量分n步即可完成此作業。你可以僅使用幾十位元組的微小記憶體,花費與n成比例的時間來旋轉該向量嗎?
解決思路
方案一:
將向量x中的前i個元素複製到乙個臨時陣列中,接著將餘下的n-i個元素左移i個位置,然後再將前i個元素從臨時陣列中複製回x中的後面位置。
該方案使用了i個額外的位置,如i足夠大,過於浪費空間。
方案二:
定義乙個函式來將x向左旋轉乙個位置,然後呼叫該函式i次。
該方案需要將陣列移到i將,過於浪費時間。
方案三:
先將x[0]移臨時變數t中,然後將x[i]移到x[0]中,x[2i]移到x[i]中,依次類推,直到我們又回到從x[0]中提取元素,不過在這時我們要從t中提取元素,然後結束該過程。當i=3,n=12時,該階段將以下面的次序移到各個元素。
如果該過程不能移動所有的元素,那麼我們再從x[1]開始移動,一直依次進行下去,直到移動了所有的元素時為止。
該方案過於精巧,像書中所說的一樣堪稱巧妙的雜技表演,非常容易出錯。
**實現:
#include "stdafx.h"
#include#include #define max 8
#define i 3
using namespace std;
int main()
a[tempj] = temp;
counter++;//這裡照樣移動一次
j = index+1;
} //測試輸出
for (int ii = 0;ii < max; ii++)
cout << a[ii]<
int t;
cin >> t;
return 0;
}
方案四:
旋轉向量x實際上就是將向量ab的兩個部分交換為向量ba,這裡a代表x的前i個元素。假設a比b短。將b分割成bl和br,使br的長度和a的長度一樣。交換a和br,將ablbr轉換成brbla。因為序列a已在它的最終位置了,所以我們可以集中精力交換b的兩個部分了。由於這個新問題和原先的問題是一樣的,所以我們以遞迴的方式進行解決。
該方案要求編碼細膩,還需要深思熟慮,以確保程式具有足夠的效率。
方案五:(最佳)
將這個問題看作是把陣列ab轉換成陣列ba吧,但同時也假定我們具有在陣列中轉置指定部分元素的函式。我們先從ab開始,轉置a得到arb,再轉置b得到arbr,然後再轉置整個arbr得到(arbr)r,實際上就是ba。
reverse(0, i-1) /*cbadefgh*/
reverse(i, n-1) /*cbahgfed*/
reverse(0, n-1) /*defghabc*/
該轉置**在時間和空間上都很有效,並且是這麼簡短和簡單,想出錯都很難。
書中還提供了將10個元素的陣列向上旋轉5個位置的手搖法例子:先是掌心對著你自己,左手在右手上面,如圖所示
**實現 ?
#include void swap(int *p, int *q);
void reverse(int *vector, int index_begin, int index_end);
void revrot(int *vector, int len, int step);
int main(int argc, char **argv);
revrot(vector, 8, step);
printf("after revolve: ");
for(i = 0; i < 8; i++)
printf("\n");}
void swap(int *p, int *q)
void reverse(int *vector, int index_begin, int index_end)}
void revrot(int *vector, int len, int step)
程式設計之法 字串旋轉
題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前3個字元 a b 和 c 移到字串的尾部,那麼原字串將程式設計 defabc 解法1 蠻力移位,include include define len a sizeof a sizeof a using ...
程式設計之美 旋轉字串
1 設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。既 abcd1234,右移k 4位,變為1234abcd includeusing namespace std 方式1,每次右移動1位,時間複雜度為o m n void rightshift ...
15 程式設計珠璣筆記十五字串
15 程式設計珠璣筆記十五字串 本篇名言 老闆無胸懷,企業無團隊。老總無思想,企業無文化。一轉眼就瞄到了 程式設計珠璣 的最後一章。到此有3個事情是確定的 1 並沒有完全理解作者講的所有 2 後續需要在實踐中不斷體會和體會 3 活到老學到老 當然程式設計珠璣還有一本續集的,後續還會學習之的。最後一章...