当前位置:   article > 正文

Java算法题:轮转数组_轮转数组算法题java

轮转数组算法题java

LeetCode原题:

给你一个数组,将数组中的元素向右轮转k个位置(k为非负数)

方法一:暴力遍历:

思路:

*两层循环,一层for循环表示转轮次数,并创建临时变量存储数组末尾元素

*第二层for循环,从数组的倒数第二个元素开始遍历覆盖

代码如下:

  1. public class Test {
  2. public static void main(String[] args) {
  3. int[]nums={-4,-1,0,3,10};
  4. rotate(nums,3);
  5. }
  6. public static void rotate(int[]nums,int n){
  7. //标记数组长度
  8. int length=nums.length-1;
  9. //遍历数组(n:转轮的次数)
  10. for(int i=0;i<n;i++){
  11. //标记数组末尾元素(后面覆盖遍历的时候会覆盖末尾元素)
  12. int temp=nums[length];
  13. //从数组倒数第二个元素开始遍历覆盖元素.比如:j=3时,nums[j+1]=nums[j]-->nums[4]=nums[3];
  14. for(int j=length-1;j>=0;j--){
  15. nums[j+1]=nums[j];
  16. }
  17. //前面标记的末尾数组元素补回第一个位置
  18. nums[0]=temp;
  19. }
  20. for(int i=0;i<nums.length;i++){
  21. System.out.print(nums[i]);
  22. System.out.print(",");
  23. }
  24. }

结果如下:

 

方法二:新数组储存

思路:

*创建一个新数组,新数组长度等于被拷贝的数组长度

*数组:[-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:拷贝数据长度

代码如下:

  1. public class Test {
  2. public static void main(String[] args) {
  3. int[]nums={-4,-1,0,3,10};
  4. rotate1(nums,1);
  5. }
  6. public static void rotate1(int[]nums,int k){
  7. int n=nums.length;
  8. int []array=new int[n];
  9. for(int i=0;i<n;i++){
  10. array[(i+k)%n]=nums[i];
  11. }
  12. System.arraycopy(array,0,nums,0,n);
  13. for(int i=0;i<nums.length;i++){
  14. System.out.println(array[i]);
  15. System.out.println(",");
  16. }
  17. }
  18. }

结果如下:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/567410
推荐阅读
相关标签
  

闽ICP备14008679号