陣列迴圈移位(m位)

2021-08-27 22:06:55 字數 1858 閱讀 8017

看到這個題目,一般是先實現題目意思再說,一般我們按照正常思路解題,將陣列元素迴圈右移,比如abcd1234,假若迴圈四位,就是4abcd123->34abd12->234abcd1->1234abcd,這樣的話**很簡單:?

1

2

3

4

5

6

7

8

rightshift(intarr,intn,intk)

arr[0]=t;

}

}

這樣寫是可以實現迴圈向右移動,但是這樣的時間複雜度實o(n * k),是不符合題目要求的。那麼還需要別的解法。

我們通過觀察看以看到,陣列abcd234向右移動k位,相當於向左移動-k位,向右移動跟向左移動本質上是一樣的。

在考慮解題的同時,我們應該想到的是k的取值是可以大於n的,不要讓慣性思維束縛了我們的大腦,假若k>n,那麼陣列向右移動4位跟向右移動12位,20,28是等同的,那麼我們可以先做乙個處理,k=k%n,這樣我們的**就變成了:?

1

2

3

4

5

6

7

8

9

rightshift(intarr,intn,intk)

arr[0]=t;

}

}

這樣結果的話,運算的時間複雜度變成了o(n * n ),時間複雜度降低了,但是還不符合題目要求;,繼續探索

假如abcd234向右移動四位的話,我們可以發現其實是abcd跟1234兌換了一下,把兩部分分別看成乙個整體,然後兌換,具體步驟如下:

1、abcd倒敘->dcba1234

2、1234倒敘->dcba4321

3、全部倒敘->1234abcd

按照這個思路寫**的話就變成了如下結果:?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

reghtshift(intarr,intn,intk)

reverse(intarr,intb,inte)

}

陣列迴圈移位

陣列迴圈移位 對於存有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...