【问题标题】:simple Inplace square matrix clockwise rotation in java - what is wrong with my codejava中简单的Inplace方阵顺时针旋转 - 我的代码有什么问题
【发布时间】:2013-08-22 23:28:26
【问题描述】:
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 变量的原因。

即使在我旋转之后,我也会打印相同的数组......我在这里做错了什么?

【问题讨论】:

  • 旋转是指转置吗?
  • swap 方法在很多方面都做错了,你应该删除它,因为幸运的是它从未使用过。

标签: java algorithm multidimensional-array 2d


【解决方案1】:

在您的第二个 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 369

147
258 369

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

当您最初以k = 0 开头时,您实际上是在整个循环中旋转(如果您添加调试打印语句可以看到)。

【讨论】:

  • @user2664398:没问题!
【解决方案2】:

您实际上是在 旋转两次,因为 rotate 方法中的内部循环在整个长度上都起作用。

改用for (int k=0; k&lt;i; k++)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多