首先我们默认=表示转置符号那么行列转置有;
//[0][0]=[0][0] //[0][1]=[1][0] //[0][2]=[2][0]
//[1][0]=[0][1] //[1][1]=[1][1] //[1][2]=[2][1]
//[2][0]=[0][2] //[2][1]=[1][2] //[2][2]=[2][2]
1.我们观察到行列转置在表面上是行列交换
2.但是我们发现,对角线是不用处理的所以有
//[0][0]=[0][0] //[1][1]=[1][1] //[2][2]=[2][2]
换成代码描述就是
if(x==y) {
continue;
}
2.再仔细观察我们发现
//[0][1]=[1][0] //[1][0]=[0][1]
//[0][2]=[2][0] //[2][0]=[0][2]
//[1][2]=[2][1] //[2][1]=[1][2]
发现存在重复置换导致最后没有效果
所以考虑控制转置次数发现把行控制在2时就可以了,原因是最后一行每个元素都存在重复置换或者是不需要执行操作的元素
所以完整代码如下:
public class 数组转置 {
public static void main(String[] args) {
int[][] data=new int[][] {{1,2,3},{4,5,6},{7,8,9}};//三行三列的矩阵
System.out.println("转置前:");
print(data);
transfer(data);
System.out.println("转置后:");
print(data);
}
public static int[][] transfer(int[][] temp) {
for(int x=0;x<=temp.length/2;x++) {//行控制
for(int y=0;y<temp[x].length;y++) {//列控制
if(x==y) {
continue;
}
if(x==1&y==0) {
continue;
}
//行列转置
int tem=temp[x][y];
temp[x][y]=temp[y][x];
temp[y][x]=tem;
}
}
return temp;
}
public static void print(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();
}
}
}
第二种思维
//[0][0]=[0][0] //[0][1]=[1][0] //[0][2]=[2][0]
//[1][0]=[0][1] //[1][1]=[1][1] //[1][2]=[2][1]
//[2][0]=[0][2] //[2][1]=[1][2] //[2][2]=[2][2]
在对角线的一侧交换即可
每一个都是从行列相等处开始执行
public class 数组转置 {
public static void main(String[] args) {
int[][] data=new int[][] {{1,2,3},{4,5,6},{7,8,9}};//三行三列的矩阵
System.out.println("转置前:");
print(data);
transfer(data);
System.out.println("转置后:");
print(data);
}
public static int[][] transfer(int[][] temp) {
for(int x=0;x<temp.length;x++) {//行控制
for(int y=x;y<temp[x].length;y++) {//列控制
//行列转置
int tem=temp[x][y];
temp[x][y]=temp[y][x];
temp[y][x]=tem;
}
}
return temp;
}
public static void print(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();
}
}
}