Rotate an array of n elements to the right by k steps.
还有就是简单的step by step即向右移动k位分成k次向右移动一位:
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,向右循环移动k位:
最简单想到的就是借助一个临时数组存储循环移动k位后的数:
void rotate(int* nums, int numsSize, int k) {
int *p=(int *)malloc(sizeof(int)*numsSize);
memset(p,0,sizeof(p));
for(int i=0;i<numsSize;i++)
p[(i%numsSize+k)%numsSize]=nums[i];
for(int i=0;i<numsSize;i++)
nums[i]=p[i];
}
还有就是简单的step by step即向右移动k位分成k次向右移动一位:
void rotate(int* nums, int numsSize, int k) {
int temp;
for(int i=0;i<k;i++){
temp=nums[numsSize-1];
for(int j=numsSize-1;j>0;j--)
nums[j]=nums[j-1];
nums[0]=temp;}
for(int j=0;j<=numsSize-1;j++)
cout<<nums[j]<<" ";
}
不过很遗憾,这种做法太复杂,结果显示: Time Limit Exceeded
还有一种做法是:先将数组全部反序,再根据移动位数k先将前k位又反序,再将最后k-numsSize数字反序即可:
void reverse(int *a,int *off){
int *p=(int *)malloc(sizeof(int)*(off-a));
for(int i=0;i<(off-a);i++)
p[i]=*(off-i-1);
for(int i=0;i<(off-a);i++)
a[i]=p[i];
}
void rotate(int* nums, int numsSize, int k) {
k=k%numsSize;
reverse(nums,nums+numsSize);
reverse(nums,nums+k);
reverse(nums+k,nums+numsSize);
}