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]
.
思路:这题转换成对数组进行转置来做。简单来说对数组循环移动N位可以换成转置三次来完成。
如例子中:[1,2,3,4,5,6,7] 移动位k=3位。可以首先对0-3进行转置,再对4-6进行转置,最后对0-6进行转置
[4,3,2,1,5,6,7] -> [4,3,2,1,7,6,5] -> [5,6,7,1,2,3,4]
注意k可能为0或者超过数组的长度,所以首先用k对数组长度取模。
代码:
void reverse(int *nums,int first,int last)
{
while(first < last)
{
int temp = nums[first];
nums[first] = nums[last];
nums[last] = temp;
++first;
--last;
}
}
void rotate(int* nums, int numsSize, int k) {
k = k%numsSize;
if(k != 0)
{
reverse(nums,0,numsSize-k-1);
reverse(nums,numsSize-k,numsSize-1);
reverse(nums,0,numsSize-1);
}
}