日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(转)数组循环右移

發布時間:2023/12/2 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)数组循环右移 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設計一個算法,把一個含有N個元素的數組循環右移K位,要求時間復雜度為O(N),且只允許使用兩個附加變量。

不合題意的解法如下:

我們先試驗簡單的辦法,可以每次將數組中的元素右移一位,循環K次。abcd1234→4abcd123→34abcd12→234abcd1→1234abcd。偽代碼如下:

代碼清單2-33

?

?

RightShift(int* arr, int N, int K)

{

????while(K--)

????{

????????int t = arr[N - 1];

????????for(int i = N - 1; i > 0; i --)

????????????arr[i] = arr[i - 1];

????????arr[0] = t;

????}

}

雖然這個算法可以實現數組的循環右移,但是算法復雜度為O(K?*?N),不符合題目的要求,需要繼續往下探索。

?

分析與解法

假如數組為abcd1234,循環右移4位的話,我們希望到達的狀態是1234abcd。不妨設K是一個非負的整數,當K為負整數的時候,右移K位,相當于左移(-K)位。左移和右移在本質上是一樣的。

【解法一】

大家開始可能會有這樣的潛在假設,K<N。事實上,很多時候也的確是這樣的。但嚴格地說,我們不能用這樣的“慣性思維”來思考問題。尤其在編程的時候,全面地考慮問題是很重要的,K可能是一個遠大于N的整數,在這個時候,上面的解法是需要改進的。

仔細觀察循環右移的特點,不難發現:每個元素右移N位后都會回到自己的位置上。因此,如果K?>?N,右移K-N之后的數組序列跟右移K位的結果是一樣的。進而可得出一條通用的規律:右移K位之后的情形,跟右移K’=?K?%?N位之后的情形一樣。

代碼清單2-34

RightShift(int* arr, int N, int K)

{

????K %= N;

????while(K--)

????{

????????int t = arr[N - 1];

????????for(int i = N - 1; i > 0; i --)

????????????arr[i] = arr[i - 1];

????????arr[0] = t;

????}

}

可見,增加考慮循環右移的特點之后,算法復雜度降為O(N),這跟K無關,與題目的要求又接近了一步。但時間復雜度還不夠低,接下來讓我們繼續挖掘循環右移前后,數組之間的關聯。

【解法二】

假設原數組序列為abcd1234,要求變換成的數組序列為1234abcd,即循環右移了4位。比較之后,不難看出,其中有兩段的順序是不變的:1234和abcd,可把這兩段看成兩個整體。右移K位的過程就是把數組的兩部分交換一下。變換的過程通過以下步驟完成:

1.???逆序排列abcd:abcd1234 →?dcba1234;

2.???逆序排列1234:dcba1234 →?dcba4321;

3.???全部逆序:dcba4321 → 1234abcd。

偽代碼可以參考如下:

代碼清單2-35

Reverse(int* arr, int b, int e)

{

????for(; b < e; b++, e--)

????{

????????int temp = arr[e];

????????arr[e] = arr[b];

????????arr[b] = temp;

????}

}

RightShift(int* arr, int N, int k)

{

????K %= N;

????Reverse(arr, 0, N – K - 1);

????Reverse(arr, N - K, N - 1);

????Reverse(arr, 0, N - 1);

}

這樣,我們就可以在線性時間內實現右移操作了。

轉載于:https://www.cnblogs.com/boluo007/p/5470242.html

總結

以上是生活随笔為你收集整理的(转)数组循环右移的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。