标签:
题目:把一个含有N个元素的字符串右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
例子:
字符串为:abcd1234,右移4位,结果变为:1234abcd
思路:
移动前跟移动后是有两段的顺序是不变的,所以可以把这两段看成两个整体
右移K位的过程就是把数组的两部分交换一下。
交换的过程:(1)逆序排列第一部分
(2)逆序排列第二部分
(3)再全部逆序!
代码:
#include <iostream> using namespace std; const int MAXN = 10000; int Array[MAXN], n, k; void Reverse(int *A, int b, int e) { for(; b < e; ++b, --e) { int temp = A[b]; A[b] = A[e]; A[e] = temp; } } void RightShift(int *A, int n, int k) { k %= n; Reverse(A, 0, n-k-1); Reverse(A, n-k, n-1); Reverse(A, 0, n-1); } int main() { cin >> n >> k; for(int i = 0; i < n; ++i) cin >> Array[i]; RightShift(Array, n, k); for(int i = 0; i < n; ++i) cout << Array[i]; cout << endl; return 0; }
标签:
原文地址:http://blog.csdn.net/u010470972/article/details/43116061