程式設計珠璣 旋轉字串

2021-07-11 10:28:00 字數 2191 閱讀 7242

問題描述

請將乙個具有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 活到老學到老 當然程式設計珠璣還有一本續集的,後續還會學習之的。最後一章...