0
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 变量的原因。

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

4

2 回答 2

2

在您的第二个 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 < main 方法中的第一个打印语句
789

147
258 <在旋转方法
369中打印语句

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

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

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

于 2013-08-20T19:14:35.297 回答
1

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

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

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

于 2013-08-20T19:16:23.723 回答