n元一維向量向左旋轉i個位置

2021-06-01 09:51:18 字數 1086 閱讀 5881

第一篇原創。。

在《程式設計珠璣》第2章的開頭有三個問題,其中的第2個問題,即問題b是這樣的:

將乙個n元一維向量向左旋轉i個位置,例如,當n=8且i=3時,向量abcdefgh旋轉為defghabc。簡單的**使用乙個n元的中間向量在n步內完成該工作,要求僅用幾十個額外位元組的儲存空間、o(n)的時間內完成向量的旋轉。

我首先想到的是:將a陣列的前i個元素複製到乙個臨時陣列中,然後將餘下的n-i個元素向左移動i個位置,最後將最初的i個元素從臨時陣列中複製到a中餘下的位置。但是,這種方法使用的i個額外的位置消耗了過大的儲存空間。

另外一種的方法是定義乙個函式將a向左旋轉乙個位置(其時間為o(n))然後呼叫該函式i次,但這種方法又產生了過多的執行時間消耗。

書中介紹的方法很有意思,原文是這樣描述的「這個方法有點像精巧的雜技動作,移動a[0]到臨時變數t,然後移動a[i]至a[0],a[2i]至a[i],依次類推(將a中的所有下標對n取模),直至返回到取a[0]中的元素,此時改為從t取值然後終止過程。如果該過程沒有移動全部元素,就從a[1]開始再次進行移動,直到所有的元素都已經移動為止。」

然後就嘗試將其還原為**,這段話不是非常的詳細,一開始是用n=12、i=3做實驗的,以為是一輪一輪的變換,共i輪,但是n=10、i=3時就不對了,所以肯定是錯誤了,仔細琢磨這段話,它的結束條件是兩個,其一是取到t賦值的那個元素(這段話沒有描述清楚的乙個很重要的地方),其二是移動了全部的元素。另外乙個地方是,比如從a[1]開始再次進行移動則是移動a[i+1]至a[1],a[2i+1]至a[i+1],依次類推。源**實現為:

#include using namespace std;

void fun(int, int);

int main()

void fun(int n, int i)

{ int j= 0, t, from, to,count;

int *a = new int[n];

for (j=0; j執行結果舉例:

這個思路挺有意思的~

182 將字串向左旋轉N個位置

題目如下 給定乙個字串s和乙個數字n,將字串向左旋轉n個位置,然後輸出 示例 將字串s hellolinzeyu 向左旋轉5個位置 輸出 linzeyuhello 解題思路如下 我們先來了解一下 c 中str.substr的用法 假設 string s 0123456789 string sub1 ...

一維向量類

程式的版權和版本宣告部分 檔名稱 test.cpp 作 者 任子儀 完成日期 2014年 5月 3日 版 本 號 v12.1 輸入描述 無 問題描述 程式輸出 問題分析 略 演算法設計 略 includeusing namespace std class myvector 定義向量類 myvecto...

一 n維蛇形矩陣構建

一 基礎版的蛇形方陣,如下圖所示 思路 我們先構建乙個n n的矩陣dp 列表 然後用0填充,初始值 value 1,然後value 1更新值,將value填入到每乙個位置。對於上圖所示,我們發現元素在每乙個圈都是以順時針列印,那麼可以將每乙個圈設定為乙個迴圈。對於乙個外圈,可以看到它是從左到右,從上...