演算法練習 一維陣列旋轉

2021-12-29 21:06:12 字數 1072 閱讀 3265

題目描述:求乙個一維陣列向右旋轉k個位置後的結果。比如,一維陣列,當k = 2時,求得的結果為。要求常數級空間複雜度,允許修改原有陣列。

這樣很簡單,使用乙個額外的空間,儲存原有陣列的元素,然後可以錯位複製原有陣列

元素,即可達到題目的要求。比如陣列,當k = 2時,先將4,5複製到結果陣列,然後將1,2,3複製到結果陣列的後面部分。

//使用額外空間進行陣列旋轉

void rotatearrayk_ext( int narray, int ncount, int k )

//進行錯位複製

int i = 0;

for ( i = 0; i < k; ++i )

for ( int j = 0; i < ncount; ++i )

}函式rotatearrayk_ext的空間複雜度為o(n),時間複雜度也為o(n),顯然,在空間複雜度這一塊是不符合題目要求的。

在此要求下,我們可以對陣列進行三次反轉,從而求得結果。三次反轉陣列:第一次反轉整個陣列;第二次反轉陣列前k個數;第三次反轉剩下的數。例如:

一維陣列,k = 2

第一次反**5,4,3,2,1

第二次反**4,5,3,2,1

第三次反**4,5,1,2,3

程式**如下:

//反轉陣列

bool reversearray( int narray, int ncount, int nstart, int nend )

return true;

}//對陣列實施三次反轉來進行陣列的旋轉

void rotatearrayk( int narray, int ncount, int k )

此演算法擁有常數級的空間複雜度,因為演算法裡執行了三次反轉陣列,反轉陣列都是**性時間裡完成的,所以此演算法的時間複雜度為o(n)。

系列文章說明:

1.本系列文章[演算法練習],僅僅是本人學習過程的乙個記錄以及自我激勵,沒有什麼說教的意思。如果能給讀者帶來些許知識及感悟,那是我的榮幸。

2.本系列文章是本人學習陳東鋒老師《進軍矽谷,程式設計師面試揭秘》一書而寫的一些心得體會,文章大多數觀點均來自此書,特此說明!

作者:山丘兒

一維陣列練習

陣列求和求平均值 include include include 時間的標頭檔案 int main1 int all 0 和 double total 0.0 平均值用實數 for int i 0 i 10 i 迴圈 total all 先讓平均值等於所有數之和 total 10 進行除法 prin...

一維陣列練習題

關於陣列的說法錯誤的是 a 陣列中可以儲存多個資料 b 陣列中儲存的多個資料的型別必須一致 c 陣列的長度一旦確定,可以發生改變 d 乙個變數中只能儲存乙個資料,新儲存的資料會把原有資料替換掉 以下定義float型別的陣列變數哪一項是正確的 a float a 8.8f b float b c fl...

一維陣列與二維陣列題目練習

1620 7 唐大智 2016年10月24日 連續第二十四天總結 內容 a 輸入陣列,定義指標p指向陣列第乙個元素,即p a或p a 0 此刻p i 等同於a i 輸入陣列時,輸出指標所指元素,然後移動指標的位置使其指向下乙個元素。include cout n b 定義3行4行的二維陣列b,元素p指...