陣列迴圈移位

2021-05-22 17:55:08 字數 611 閱讀 7278

陣列迴圈移位         

對於存有n個整數的陣列,將其向左迴圈移動k個位置,(x0, x1,……, xn-1)變換為(xk, xk+1, …, xn-1, x0, x1, …, xk-1)

最直接的方法就是每次將首位的數放到乙個臨時的整型變數中,後面n-1個數一次左移,這樣需要k次才能完成,而每次的複雜度是o(n),因此總共其複雜度是o(k * n)。

一種比較簡便的方法就是利用乙個類似於德摩根定律的方法,對於陣列a,將它分為兩截,分別為b和c,如果分別對b和c進行逆序操作,然後再對整個陣列進行逆序操作,則就可達到左移k個位置的目的。

假設原陣列序列為0123456,要求變換成的陣列序列為4560123,即迴圈左移了4位。比較之後,不難看出,其中有兩段的順序是不變的:0123和456,可把這兩段看成兩個整體。左移k位的過程就是把陣列的兩部分交換一下。變換的過程通過以下步驟完成:

1.   逆序排列0123:0123456 → 3210456;

2.   逆序排列456:3210456 → 3210654;

3.   全部逆序:3210654 → 4560123。

這個過程可以被簡單地證明。

並且時間複雜度為o(n)。

程式是在linux上執行的

陣列迴圈移位

題目 設計乙個演算法,把乙個含有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...

陣列迴圈移位

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。k可能大於n,但對k n就可。如下 reverse int arr,int b,int e for bint temp arr e arr e arr b arr b temp rightshif...