旋转数组;给定一个数组,旋转K次,要求输出旋转后的数组(旋转K次即将所有元素移动K次)

题目要求:

旋转数组;给定一个数组,旋转K次,要求输出旋转后的数组;(旋转K次即将所有元素移动K次)。

例如:int [] num={1,2,3,4,5,6};向右旋转K=3;

输出:int [] num={4,5,6,1,2,3};

解释:

向右旋转一次即将所元素向右移动一次;所以向右旋转K次就为向右移动K次。

方法一:

计算每个元素移动K次对应的位置:

代码如下:

import java.util.Arrays;

public class XuanZhuan {
	public static void main(String[] args) {
		XuanZhuan xz = new XuanZhuan();
		int [] a= {1,2,3,4,5,6};
		xz.show(a,3);
	}
	    public void show(int[] a, int k) {
	     int n=a.length;            //求数组长度
	     if (k>n) {                    //当右移次数大于数组长度,取模后的只为新的要移动的次数
	      k=k%n;       
	  }  
	     int[] b=new int[n];         
	     b=Arrays.copyOf(a, n); //复制一个相同数组
	     
	     for (int i = 0; i < n; i++) {   //每个数都循环移动k个数
	      int p=(i+k)%n;
	      a[p]=b[i];
	  }
	 
	     for (int x:a) {            //输出可不写,仅为自己查看结果
	   System.out.print(x);
	  }     
	    }
	
}

方法二:

暴力旋转发;利用循环将每个元素以每次旋转一位,进行K次旋转;比较费时间;

代码如下:


public class XuanZhuan2 {
	public static void main(String[] args) {
		XuanZhuan xz = new XuanZhuan();
		int [] a= {1,2,3,4,5,6};
		xz.show(a,3);
	}
	
	    public void show(int[] a, int k) {
	     int n=a.length;
	     if (k>n) {
	      k=k%n;       
	  }   
	     for (int i = 1; i <k; i++) {         //进行k次循环,每次向右移动一位
	       int temp=a[n-1];
	   for (int j = n-2; j >=0; j--) {
	    a[j+1]=a[j];//每个元素一次向右移动一位
	   }
	   a[0]=temp;
	  }   
	  for (int x:a) {
	   System.out.println(x);
	  }      
	    }
	}

Guess you like

Origin blog.csdn.net/qq_52253798/article/details/120404482