题目原文:
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].
题目大意:
给一个数组,循环右移k位。
题目分析:
这题好像也是考研408复习资料里面出现过的一道题,(还是笔试原题?我忘了)。如果不给出答案我也是想不到的。用三步翻转实现:
(1) 先翻转前n-k位;
(2) 再翻转后k位;
(3) 再从头到尾翻转。
但本题中k有可能大于数组长度n,这种情况下相当于循环移动了n%k次(剩下的因为是整除的,相当于循环移动了n的整数倍,等于没移)
源码:(language:c)
void rotate(int* nums, int numsSize, int k) {
if(k>=numsSize)
k=k%numsSize;
reverse(nums,numsSize-k);
reverse(nums+numsSize-k,k);
reverse(nums,numsSize);
}
void reverse(int* a,int n)
{
int i,t;
for(i=0;i<n/2;i++) {
t=*(a+i);
*(a+i)=*(a+n-i-1);
*(a+n-i-1)=t;
}
}
成绩:
8ms,beats 9.23%,众数8ms,90.77%