移动数组元素的位置

Posted on 2018-08-13 19:56  豆豆2018  阅读(747)  评论(0编辑  收藏  举报

题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数

原数组:
[2, 3, 4, 6, 7, 9]
请输入要移动的位数:3
[6, 7, 9, 2, 3, 4]

数组的长度是有限的,移动超出数组长度的元素重新排在数组的前面

方法一,记录移动的位置

比如整体向后移动两位,也就是7,9的索引要变成0,1; 而2,3,4,6 的索引要加2;数组的长度len=6,利用这个关系,我们写一个方法

    public static void function() {
        int[] array={2,3,4,6,7,9};
        //复制一个数组,用于数据的存放
        int [] arraycopy=Arrays.copyOf(array, array.length);
        //定义移动的位数
        //索引
        int len=array.length;
        System.out.println("原数组:");
        System.out.println(Arrays.toString(array));
        
        System.out.println("请输入要移动的位数:");
        Scanner sc=new Scanner(System.in);
        int moveNum=sc.nextInt();
        
        int point=len-moveNum;//6-2=4
        for (int i = 0; i < array.length; i++) {
            if (i<point) {
                arraycopy[i+moveNum]=array[i];//交换索引值
            }
            if (i>=point) {
                arraycopy[i-point]=array[i];//交换索引值
            }
            
        }
        System.out.println("移动后:");
        System.out.println(Arrays.toString(arraycopy));
        
    }

方法2,可以利用数组的长度,用同样的原理动态去改变数组各个元素索引的变化

 1 //动态变化索引  新的索引值=(原索引+移动位数)%数组长度,向右移动可以理解溢出,length是一个长度循环
 2     public static void function01() {
 3         int[] array={2,3,4,6,7,9};
 4         //复制一个数组,用于数据的存放
 5         int [] arraycopy=Arrays.copyOf(array, array.length);
 6         System.out.println("原数组:");
 7         System.out.println(Arrays.toString(array));
 8         System.out.println("请输入要移动的位数:");
 9         Scanner sc=new Scanner(System.in);
10         
11         int moveNum=sc.nextInt();//移动的位数
12         
13         for (int i = 0; i < arraycopy.length; i++) {
14             int move=(i+moveNum)%array.length;
15             arraycopy[move]=array[i];
16         }
17         System.out.println(Arrays.toString(arraycopy));
18         
19         
20     }