陣列迴圈移位的幾種解法

2022-09-02 03:12:14 字數 1463 閱讀 7750

題目描寫敘述:

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位。

解法一:

最easy想到的就是每次將陣列中的元素右移一位,迴圈k次。

#include

using

namespace

std;

void rightshift(int *arr, int n, int k)

arr[0]=t;

}}int main();

for(int i = 0; i < 4;i++)

cout

<<'\n';

rightshift(num,4,2);

for(int i = 0; i < 4;i++)

這裡的複雜度為k*n次,我們接下來再用乙個方法來改進。

解法二:

用空間來換時間,申請乙個大小為k%n的陣列,由於迴圈移位k次,假設k > n。則其效果與移動k%n次是一樣的。

所以在解法一,我們能夠加上 k = k %n 這句。

假如原陣列: 1 2 3 4 5 6 7 須要右移4次。那麼我們想要的結果是: 5 6 7 1 2 3 4

我們注意到。事實上就是將1234前四個元素拿出來(變成array a: _ _ _ _ 5 6 7, array b:1 2 3 4),然後將567前移充填(a 變成 5 6 7 _ _ _ _)。然後我們僅僅要將 b 陣列再加入到a 陣列後面就完畢了。 最後 (a : 5 6 7 1 2 3 4)

void rightshift(int *arr, int n, int k)

for(;i// 將陣列第k+1 - n 位移到arr前端。

arr[s] = arr[i];

}for(i = 0; s < n;i++,s++)

}

這裡對陣列進行了複製k次。將後面的元素前移n-k次,然後再將k 個元素拼接到陣列後面進行了k次操作。一共進行了n+k次操作。然而空間複雜度為k.

解法三:

這裡有乙個非常巧妙的方法來實現陣列迴圈。

假如原陣列: 1 2 3 4 5 6 7 須要右移4次,那麼我們想要的結果是: 5 6 7 1 2 3 4。

1.將1234逆置 變成 4321

2.將567逆置 變成 765

3.將兩個逆置陣列拼接: 4321765

4.將這個已拼接的陣列逆置: 5671234 就成了我們想要的結果了。

void reverse(int *arr,int start,int

end)

}void rightshift(int* arr,int n, int k)

上述演算法reverse函式時間複雜度分別為k/2, (n-k)/2,n/2, 所以總的複雜度為o(n)。空間複雜度為o(1)

陣列迴圈移位

陣列迴圈移位 對於存有n個整數的陣列,將其向左迴圈移動k個位置,x0,x1,xn 1 變換為 xk,xk 1,xn 1,x0,x1,xk 1 最直接的方法就是每次將首位的數放到乙個臨時的整型變數中,後面n 1個數一次左移,這樣需要k次才能完成,而每次的複雜度是o n 因此總共其複雜度是o k n 一...

陣列迴圈移位

題目 設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求複雜度為o n 且只允許使用兩個變數 思考問題 1 考慮原始解法 直接迴圈移動陣列k次,則演算法複雜度為0 n k 使用額外兩個變數完成,顯然複雜度依賴於k的值,如果k n,則演算法複雜度大於或等於o n 2 2 考慮改進 原始演算法複...

陣列迴圈移位

問題描述 n個元素儲存於陣列a 0.n 1 中,求向右或向左迴圈移位 k k 0 位得到的新陣列a。1.迴圈右移 步驟 1 k k n 2 把序列分成前 n k 個數和後k個數兩組分別進行逆轉操作,如下圖 如下 void rightshift char a,int n,int k 其中reverse...