數組的轉置就是將數組的內容倒序進行保存。例如:數組從下標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]
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]
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]
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;
}
}
}
}
}
複製代碼