赞
踩
LeetCode原题:
给你一个数组,将数组中的元素向右轮转k个位置(k为非负数)
方法一:暴力遍历:
思路:
*两层循环,一层for循环表示转轮次数,并创建临时变量存储数组末尾元素
*第二层for循环,从数组的倒数第二个元素开始遍历覆盖
代码如下:
- public class Test {
- public static void main(String[] args) {
- int[]nums={-4,-1,0,3,10};
- rotate(nums,3);
- }
- public static void rotate(int[]nums,int n){
- //标记数组长度
- int length=nums.length-1;
- //遍历数组(n:转轮的次数)
- for(int i=0;i<n;i++){
- //标记数组末尾元素(后面覆盖遍历的时候会覆盖末尾元素)
- int temp=nums[length];
- //从数组倒数第二个元素开始遍历覆盖元素.比如:j=3时,nums[j+1]=nums[j]-->nums[4]=nums[3];
- for(int j=length-1;j>=0;j--){
- nums[j+1]=nums[j];
- }
- //前面标记的末尾数组元素补回第一个位置
- nums[0]=temp;
- }
- for(int i=0;i<nums.length;i++){
- System.out.print(nums[i]);
- System.out.print(",");
- }
- }
结果如下:
方法二:新数组储存
思路:
*创建一个新数组,新数组长度等于被拷贝的数组长度
*数组:[-4,-1,0,3,10],转轮一次,即k=1,结果为:[10,-4,-1,0,3]
[-4,-1,0,3,10],转轮二次次,即k=2,结果为:[10,-4,-1,0,3] ->[3,10,-4,-1,0]
[-4,-1,0,3,10],转轮二次次,即k=2,结果为:[10,-4,-1,0,3] ->[3,10,-4,-1,0]->[0,3,10,-4,-1]
所以我们发现一个规律公式:array[(i+k)%array.length]=array[i]
*最后使用数组拷贝方法:System.arrayCopy(Object src,int srcPos,Object dest,int destPos,int length)
src:拷贝目标数组
srcPOS:从目标数组哪个下标开始拷贝
dest:放置到哪个数组
destPos:从dest的哪个下标开始放置
length:拷贝数据长度
代码如下:
- public class Test {
- public static void main(String[] args) {
- int[]nums={-4,-1,0,3,10};
- rotate1(nums,1);
- }
- public static void rotate1(int[]nums,int k){
- int n=nums.length;
- int []array=new int[n];
- for(int i=0;i<n;i++){
- array[(i+k)%n]=nums[i];
- }
- System.arraycopy(array,0,nums,0,n);
- for(int i=0;i<nums.length;i++){
- System.out.println(array[i]);
- System.out.println(",");
- }
- }
- }
结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。