Java一维数组和二维数组的转置

数组的转置就是将数组的内容倒序进行保存。例如:数组从下标0开始元素内容为1,2,3,4,5,6,将这个数组转置以后从下标0开始元素内容为6,5,4,3,2,1。

一维数组的转置

思路一、定义一个新的数组,将原始数组按照倒序的方式插入新的数组中,随后改变原始数组的引用。

public class ArraysDemo {
    public static void main(String[] args) {
        int data[] = new int[]{90, 52, 3, 56, 66, 32, 12, 0, 26};
        //定义一个新数组
        int temp[] = new int[data.length];
        int foot = data.length-1;//控制data数组的索引
        //对于新的数组按照索引由小到大的顺序循环
        for (int i = 0; i < temp.length; i++) {
            temp[i] = data[foot--];
        }
        //让data指向temp,而data的原始数据就成了堆内存中的垃圾值
        data = temp;
        show(data);
    }
 
    public static void show(int temp[]) {
        for (int i = 0; i < temp.length; i++) {
            System.out.print(temp[i] + "\t");
        }
    }
}

虽然以上代码实现转置,但是在对堆内存中留下的data原数据,垃圾值。

思路二、利用算法,在一个数组上完成转置操作

原始数组:90, 52, 3, 56, 66, 32, 12, 0, 26

第一次转置(将第一个和最后一个交换位置):
26, 52, 3, 56, 66, 32, 12, 0, 90

第二次转置(将第二个和倒数第二个进行转置)
26, 0, 3, 56, 66, 32, 12, 52, 90

第三次转置:
26, 0, 12, 56, 66, 32, 3, 52, 90

第四次转置:
26, 0, 12, 32,66, 56, 3, 52, 90

转换次数为:数组的长度/2(不管是奇数个数还是偶数的个数,转置次数计算方式一样。Int类型不保留小数位,所以结果一样)

实现代码:

public class ArraysDemo {
    public static void main(String[] args) {
        int data[] = new int[]{90, 52, 3, 56, 66, 32, 12, 0, 26};
        reverse(data);
        show(data);
    }
 
    public static void show(int temp[]) {
        for (int i = 0; i < temp.length; i++) {
            System.out.print(temp[i] + "\t");
        }
    }
 
    //数组转置操作方法
    public static void reverse(int temp[]) {
        //转置的次数
        int sum = temp.length / 2;
        //开始的索引
        int start = 0;
        //结尾的索引
        int end = temp.length - 1;
        for (int i = 0; i < sum; i++) {
            int num = temp[start];
            temp[start] = temp[end];
            temp[end] = num;
            start++;
            end--;
        }
    }
}

等行等列的二维数组实现转置

分析:

前提:行与列长度相同的二维数组

1[x=0][y=0] 2[x=0][y=1] 3[x=0][y=2]

4[x=1][y=0] 5[x=1][y=1] 6[x=1][y=2]

7[x=2][y=0] 8[x=2][y=1] 9[x=2][y=2]

第一次转换(x=0,y=x=0 循环3次):

Y的第一次循环(x==y) 不满足 x!=y 不进行交换

1[x=0][y=0] 2[x=0][y=1] 3[x=0][y=2]

4[x=1][y=0] 5[x=1][y=1] 6[x=1][y=2]

7[x=2][y=0] 8[x=2][y=1] 9[x=2][y=2]

Y的第二次循环 (x=0 y=1,判断条件满足,进行交换)

1[x=0][y=0] 4[x=1][y=0] 3[x=0][y=2]

2[x=0][y=1] 5[x=1][y=1] 6[x=1][y=2]

7[x=2][y=0] 8[x=2][y=1] 9[x=2][y=2]

Y的第三次循环 (x=0 y=2,判断条件满足,进行交换)

1[x=0][y=0] 4[x=1][y=0] 7[x=2][y=0]

2[x=0][y=1] 5[x=1][y=1] 6[x=1][y=2]

3[x=0][y=2] 8[x=2][y=1] 9[x=2][y=2]

第二次转换 (x=1,y=x=1 循环2次)

Y的第一次循环(x=1 y=1 条件不满足 不进行交换)

1[x=0][y=0] 4[x=1][y=0] 7[x=2][y=0]

2[x=0][y=1] 5[x=1][y=1] 6[x=1][y=2]

3[x=0][y=2] 8[x=2][y=1] 9[x=2][y=2]

Y的第二次循环(x=1 y=2 进行交换)

1[x=0][y=0] 4[x=1][y=0] 7[x=2][y=0]

2[x=0][y=1] 5[x=1][y=1] 8[x=2][y=1]

3[x=0][y=2] 6[x=1][y=2] 9[x=2][y=2]

第三次转换(x=2 y=x=2 循环一次)

Y的第一次循环(x=2,y=2,不交换)

1[x=0][y=0] 4[x=1][y=0] 7[x=2][y=0]

2[x=0][y=1] 5[x=1][y=1] 8[x=2][y=1]

3[x=0][y=2] 6[x=1][y=2] 9[x=2][y=2]

实现代码:

public class ArraysDemo {
   public static void main(String[] args) {
       int data[][] = new int[][]{
               {1, 2, 3},
               {4, 5, 6},
               {7, 8, 9}
       };
       reverse(data);
       show(data);
   }

   public static void show(int temp[][]) {
       for (int x = 0; x < temp.length; x++) {
           for (int y = 0; y < temp[x].length; y++) {
               System.out.print(temp[x][y] + "\t");
           }
           System.out.println();
       }
   }

   //数组转置操作方法
   public static void reverse(int temp[][]) {
       for (int x = 0; x < temp.length; x++) {
           for (int y = x; y < temp[x].length; y++) {
               if (x != y) {//行和列相同,进行交换
                   int num = temp[x][y];
                   temp[x][y] = temp[y][x];
                   temp[y][x] = num;
               }
           }
       }
   }
}

你可能感兴趣的:(Java一维数组和二维数组的转置)