leetcode Rotate Array 旋转数组

来源:互联网 发布:api接口程序源码 编辑:程序博客网 时间:2024/06/13 13:42
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);}


0 0