public class ArrayRowSwap {
public static void main(String[] args) {
int arr[][] = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
System.out.println("the old array is :");
printArray(arr);
System.out.println("it's changing-----");
for(int i=0;i<arr.length;i++){
for(int j=i;j<arr.length;j++) //这个是非常好的算法,遍历次数少,并且空间复杂度为1 。需记忆。以后会是亮点的!
{ //同时这个算法就是调换两个数字,按照以前的话,就是得用temp,还得开辟新的空间。
//而这样利用异或的关系就可以完成!
if(i!=j)
{
arr[i][j]=arr[i][j]^arr[j][i];
arr[j][i]=arr[j][i]^arr[i][j];
arr[i][j]=arr[i][j]^arr[j][i];
}
}
}
printArray(arr);
}
private static void printArray(int[][] arr) {
// TODO Auto-generated method stub
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length;j++)
{
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
这个程序是互换二维数组的行与列。
按照以前的算法,需要借助temp空间去完成元素的互换,或者说需要另外开辟一个同样大小的二维数组,对应位置互相赋值。
经典的互换位置的算法:
private static void Swap(int i, int j) {
// TODO Auto-generated method stub
int temp;
temp=i;
i=j;
j=temp;
System.out.println("The a is " + i+"\nAnd b is "+j);
}
比如 i = 9 , j = 10;
i : 1001 ; j : 1010
那么使 i=i^j=1001^1010=0011
j=j^i=1010^0011=1001
i=i^j=0011^1001=1010
这样就已经实现了互换!
更加高效!
反映到最开始那个行列的互换中,我们只需要遍历对角线上半部分即可,并且也不需要构造其余的空间!