设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 (http://blog.sina.com.cn/s/blog_4c98b9600100b0pt.html) 假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成: 1. 逆序排列abcd:abcd1234 → dcba1234; 2. 逆序排列1234:dcba1234 → dcba4321; 3. 全部逆序:dcba4321 → 1234abcd。 伪代码可以参考如下: 代码清单 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); } 这样,我们就可以在线性时间内实现右移操作了。
数组循环移位(转)
最新推荐文章于 2024-08-30 15:57:36 发布