[leetcode]Rotate Array

本文介绍了一种将数组中的元素向右循环移动k次的方法。通过寻找移动后元素的新位置,实现了数组的有效移位。提供了两种实现方式,一种是通过创建辅助数组进行元素复制,另一种则是使用内存拷贝函数来完成这一过程。

思路:把nums数组看作是一个循环队列(就是一个循环数组)。先找到移动后应该出现在0位置的元素。也就是pos=len-k%len;

  每移动一步 相当于索引位置反向移动一位。即如果k=1,则pos移动到数组末尾,如果k=2,pos移动到数组倒数第二个位置。

   找到移动后的起始位置后,就可以依次按顺序取值。把索引0看作接在数组最后面的元素。等等

代码:

public class Solution {
    public void rotate(int[] nums, int k) {
        int len=nums.length;
       /* int[] tt=new int[k+1];
        for(int i=0;i<k;i++)
            tt[i]=nums[len-k+i];
        for(int i=len-k-1;i>=0;--i)
            nums[k+i]=nums[i];
        for(int i=0;i<k;++i)
            nums[i]=tt[i];*/
        int nt[] = new int[len];
        int pt=k%len;
        int pos=len-pt;
        for(int i=0;i<len;i++)
            nt[i]=nums[(pos+i)%len];
        for(int i=0;i<len;++i)
            nums[i]=nt[i];
    }
}


别人的代码:

  1. void rotate(int nums[], int n, int k) {  
  2.     k = k % n;  
  3.     if (k == 0) return;  
  4.     int *temp = new int[n];  
  5.     memcpy(temp, nums+(n-k), sizeof(int)*k);  
  6.     memcpy(temp+k, nums, sizeof(int)*(n-k));  
  7.     memcpy(nums, temp, sizeof(int)*n);  
  8.     delete[] temp;  
  9. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值