繁体   English   中英

Java中简单的Inplace方阵顺时针旋转-我的代码有什么问题

[英]simple Inplace square matrix clockwise rotation in java - what is wrong with my code

class RotateMat {
static Integer[] swap(int x, int y) {
    int a=x;
    int b=y;
    a=a^b;
    b=a^b;
    a=a^b;
    return new Integer[]{a,b};

}
static int[][] rotate(int[][] arr) {
    assert arr.length == arr[0].length;
    int m = arr.length;
    for (int i=0; i<m;i++) {
        for (int k=0; k<m;k++) {
            //int[] temp_arr = swap(arr[i][k], arr[k][i]);
            //arr[i][k] = temp_arr[0];
            //arr[k][i] = temp_arr[1];
            int temp = arr[i][k];
            arr[i][k] = arr[k][i];
            arr[k][i] = temp;
        }
    }
    print(arr);
    return arr;
}

static void print(int[][] arr) {
    int n=arr[0].length;
    int m=arr.length;
    assert m==n;
    //System.out.println(m  + " " + n);

    for (int i=0; i<m;i++) {
         for (int j=0; j<n; j++) {
             System.out.print(arr[i][j]);
         }
         System.out.println();
    }
}

public static void main(String[] args) {
    int arr[][] = { {1,2,3}, {4,5,6}, {7,8,9}};
    print(arr);
    arr = rotate(arr);
    print(arr);
}

}

我是C用户,正在尝试练习更多的Java编程。 我了解Java中的按值传递,这就是我尝试从rotate()函数返回旋转数组并将其再次分配给arr变量的原因。

即使旋转后也能打印出相同的阵列。...我在做什么错?

在第二个for循环中,您使用了错误的变量。 更改此:

for (int i=0; i<m;i++) {
    for (int k=0; k<m;k++) { 
               ^
        int temp = arr[i][k];
        arr[i][k] = arr[k][i];
        arr[k][i] = temp;

对此:

for (int i=0; i<m;i++) {
    for (int k=i; k<m;k++) { 
               ^
        int temp = arr[i][k];
        arr[i][k] = arr[k][i];
        arr[k][i] = temp;

这将产生输出:

123
456 <主方法中的第一个打印语句
789

147
258 <旋转方法中的Print语句
369

147
258 <main方法中的第二个打印语句
369

注意:我在打印语句之间添加了空格

最初从k = 0开始,实际上是整个旋转(如果添加调试打印语句,则可以看到)。

实际上,您将其旋转两次 ,因为您在rotate方法中的内部循环遍历了整个长度。

尝试for (int k=0; k<i; k++)

您需要将对角线下方的元素与上方的元素交换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM