Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
[show hint]
Hint:
Could you do it in-place with O(1) extra space?
旋转n个元素向右移k步的阵列
例如:n = 7,k = 3. 数组[1, 2, 3, 4, 5, 6, 7]旋转以后得到的数组是[5,6,7,1,2,3,4]
提示:尝试尽可能多的方法来实现,至少有三种方法可以解决这个问题。
解法一:
先将5以前的数据翻转得到的数组是[4,3,2,1,5,6,7]
再将5及以后的数据翻转得到的数组是[4,3,2,1,7,6,5]
再将整个数组翻转即得到[5,6,7,1,2,3,4]. (即为所求)
void rotate(vector<int>& nums, int k) {
k = k%nums.size();
vector<int>::iterator iter;
iter = nums.end();
iter -= k;
reverse(nums.begin(), iter);
reverse(iter, nums.end());
reverse(nums.begin(), nums.end());
}
解法二:
先将后面k个数复制到一个临时数组,再将前面的n-k个数复制到临时数组的后面,使用库函数memcpy()可使执行时间缩短。但是memcpy()只接受数组指针,所以要先将vector* nums的数据复制到int *num中。
void rotate2(vector<int>& nums, int k){
int n = nums.size();
k = k % n;
int *temp = new int[n];
int *num = new int[n];
for (int i = 0; i < n; i++){
num[i] = nums[i];
}
memcpy(temp, num + n - k, sizeof(int)*k);
memcpy(temp + k, num, sizeof(int)*(n - k));
memcpy(num, temp, sizeof(int)*n);
for (int i = 0; i < n; i++){
nums[i] = num[i];
}
}
参考:
http://blog.csdn.net/booirror/article/details/43950477
http://www.shangxueba.com/jingyan/2923921.html