Java一維數組和二維數組的轉置

數組的轉置就是將數組的內容倒序進行保存。例如:數組從下標0開始元素內容爲1,2,3,4,5,6,將這個數組轉置之後從下標0開始元素內容爲6,5,4,3,2,1。算法

一維數組的轉置

思路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原數據,垃圾值。數組

思路2、利用算法,在一個數組上完成轉置操做

原始數組:90, 52, 3, 56, 66, 32, 12, 0, 26bash

第一次轉置(將第一個和最後一個交換位置): 26, 52, 3, 56, 66, 32, 12, 0, 90spa

第二次轉置(將第二個和倒數第二個進行轉置) 26, 0, 3, 56, 66, 32, 12, 52, 90code

第三次轉置: 26, 0, 12, 56, 66, 32, 3, 52, 90索引

第四次轉置: 26, 0, 12, 32,66, 56, 3, 52, 90內存

轉換次數爲:數組的長度/2(無論是奇數個數仍是偶數的個數,轉置次數計算方式同樣。Int類型不保留小數位,因此結果同樣)string

實現代碼:

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--;
        }
    }
}
複製代碼

等行等列的二維數組實現轉置

分析:

前提:行與列長度相同的二維數組class

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;
               }
           }
       }
   }
}
複製代碼
相關文章
相關標籤/搜索