程式設計之美 2 17 陣列迴圈移位 199

2021-06-21 06:32:59 字數 1893 閱讀 1980

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o(n),且只允許使用兩個附加變數。

原陣列:abcdefg

右移動3位:efgabcd

首先,如果k=1,也就是迴圈移動1位,那我們將有從後往前遍歷一次即可。使用乙個變數迴圈,另乙個變數作儲存最後乙個陣列元素。

當然,上面的思路只能針對k=1的情況。

第二個思路是,如果給了我k,那麼其實我已經直接知道每乙個陣列元素最終的位置了,那麼我針對每乙個陣列元素,算出其最終位置,將其放置即可。我的想法確實是實現了,我認為也確實是只遍歷了一遍,但是額外用的變數還比較多。具體請看下面的**吧。

#include /*將長度為length的陣列a內的每個元素,向右移動k個*/

void rightshift(int *a,int length,int k)

}/*為了測試而封裝的方法,主要是列印*/

void test(int *a,int length,int k){

int i;

printf(" 移動前:");

for(i=0;i

asd@asd-desktop:~/workspace/test/src$ ./a.out

移動前: 0 1 2 3 4 5 6

右移0個: 0 1 2 3 4 5 6

移動前: 0 1 2 3 4 5 6

右移1個: 6 0 1 2 3 4 5

移動前: 0 1 2 3 4 5 6

右移2個: 5 6 0 1 2 3 4

移動前: 0 1 2 3 4 5 6

右移3個: 4 5 6 0 1 2 3

移動前: 0 1 2 3 4 5 6

右移4個: 3 4 5 6 0 1 2

移動前: 0 1 2 3 4 5 6

右移5個: 2 3 4 5 6 0 1

移動前: 0 1 2 3 4 5 6

右移6個: 1 2 3 4 5 6 0

移動前: 0 1 2 3 4 5 6

右移8個: 6 0 1 2 3 4 5

移動前: 0

右移0個: 0

移動前: 0

右移1個: 0

移動前: 0

右移2個: 0

移動前: 0

右移3個: 0

移動前: 0

右移4個: 0

移動前: 0

右移5個: 0

移動前: 0

右移6個: 0

移動前: 0

右移8個: 0

移動前: 0 0

右移0個: 0 0

移動前: 0 0

右移1個: 0 0

移動前: 0 0

右移2個: 0 0

移動前: 0 0

右移3個: 0 0

移動前: 0 0

右移4個: 0 0

移動前: 0 0

右移5個: 0 0

移動前: 0 0

右移6個: 0 0

移動前: 0 0

右移8個: 0 0

反轉字串三次,也許很巧妙,但是你看完下面的變化之後會覺得很神奇。

abcd1234,要求右移四位,變成1234abcd。

先逆序abcd:abcd1234 成為dcba1234

再逆序1234:dcba1234 成為 dcba4321

全部逆序:dcba4321成為 1234abcd

確實很奇怪,發現的人應該很厲害吧。

上面的解釋有歧義,請看下面的反轉過程:

原陣列:abcdefg

右移動3位:efgabcd

變化過程:

將後3位反**abcd gfe

將除了後3位的反**dcba gfe

全部反**efgabcd

程式設計之美2 17 陣列迴圈移位

string rightshift1 string s,int n,int k return s string rightshift2 string s,int n,int k return s 對於abcd1234,若迴圈右移4位得到的1234abcd,可以看出有兩部分是沒有變的一部分是abcd,...

程式設計之美2 17 陣列迴圈移位

題目描述 設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數,如abcd1234迴圈右移三位,則為 abcd11234 4abcd123 34abcd12 234abcd1 思路一 暴力解法,一步步來,每次迴圈移位一次,移k n次,此時複雜度為o ...

程式設計之美 2 17 陣列移位迴圈

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。方法 將陣列a 含n個元素 右移k位,相當於把a分為兩部分,前 n k 個元素a1和後k個元素a2,右移的過程是將兩部分交換位置,即原a a1 a2,移位後為a a2 a1,a1,a2內部的元素順...