所谓的转置最简单的理解就死首尾交换。如果要想实现这样的交换有两种思路
思路一:开辟一个新的等长数组,而后将原数组倒序保存进去。
public class ArrayReverse { public static void main(String args[]) { int temp[]=new int[] {1,2,3,4,5,6,7,8,9}; temp=reverse(temp); printArray(temp); } public static int[] reverse(int arr[]) { int data[]=new int[arr.length]; int foot=0; for(int x=arr.length-1;x>=0;foot++){ data[foot]=arr[x--]; } return data; } public static void printArray(int arr[]) { for(int x=0;x<arr.length;x++) { System.out.print(arr[x]+"、"); } } }
使用此类模式实现的最大问题在于开辟了两块相同的堆内存空间,所以造成空间浪费(时间复杂度高 空间占内存时间占CPU)
思路二:在一个数组上完成
置换次数等于数组长度除2,无论奇偶
尝试二维数组的转置,肯定有一个前提:行列要相等。public static void main(String args[]) { int temp[]=new int[] {1,2,3,4,5,6,7,8,9}; reverse(temp); printArray(temp); } public static void reverse(int arr[]) { //转置的次数等于数组长度除2,无论奇偶 int center=arr.length/2; int head=0; int tail=arr.length-1; for(int x=0;x<center;x++){ int temp=arr[head]; arr[head]=arr[tail]; arr[tail]=temp; head++; tail--; } } public static void printArray(int arr[]) { for(int x=0;x<arr.length;x++) { System.out.print(arr[x]+"、"); } }
下图我们会发现中间轴并没有动(x==y),互换的都是(x,y)和(y,x)两者互换
public static void main(String args[]) { int[][] temp=new int[][] {{1,2,3},{4,5,6},{7,8,9}}; reverse(temp); printArray(temp); } public static void reverse(int arr[][]) { for(int x=0;x<arr.length;x++) { for(int y=x;y<arr[x].length;y++) { if(x!=y) { int temp=arr[x][y]; arr[x][y]=arr[y][x]; arr[y][x]=temp; }}}} public static void printArray(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]+"、"); } System.out.println(); } }