您的位置:首页 > 其它

leetcode Rotate Array 旋转数组

2015-08-03 17:28 323 查看
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,向右循环移动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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: