leetcode Rotate Array 旋转数组

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值