如何在Java中旋转二维数组

时间:2018-11-01 22:39:22

标签: java

[已解决]

这个问题的标题含糊不清,但希望这可以使事情解决。

基本上,我正在寻找一种轮换这组数据的解决方案。这些数据是通过特定方式设置的。

以下是输入和输出的示例:

输入:

3
987
654
321

输出:

123
456
789

“ 3”代表将要使用的列和行数。如果输入数字“ 4”,则可以输入4组4个整数。

输入:

4
4567
3456
2345
1234

输出:

1234
2345
3456
4567

目标是找到一种仅在需要时旋转数据的方法。您必须确保最小的角数在左上角。例如,对于上面的代码,将其旋转为1位于左上方。

我遇到的问题是我不知道如何旋转数据。我只能旋转角落,而不能旋转侧面。到目前为止,这是我的代码所做的:

  • 获取每行的输入并将其转换为字符串
  • 将这些字符串拆分为单独的字符
  • 将这些字符存储在数组中

我只是不知道如何比较那些字符,最后旋转数据。

任何帮助将不胜感激!任何问题都会得到解答。

该问题的详细描述是here(问题J4)。 这只是我为明年的比赛分配练习的挑战,因此给我答案不会“破坏”问题,但实际上可以帮助我学习。

到目前为止,这是我的代码:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);

    int max = kb.nextInt();
    int maxSqrt = (max * max);

    int num[] = new int[max];
    String num_string[] = new String[max];
    char num_char[] = new char[maxSqrt];

    int counter = 0;
    int counter_char = 0;


    for (counter = 0; counter < max; counter++) {
        num[counter] = kb.nextInt();
    }

    for (counter = 0; counter < max; counter++) {
        num_string[counter] = Integer.toString(num[counter]);
    }

    int varPos = 0, rowPos = 0, charPos = 0, i = 0;

    for (counter = 0; counter < maxSqrt; counter++) {
        num_char[varPos] = num_string[rowPos].charAt(charPos);
        i++;

        if (i == max) {
            rowPos++;
            i = 0;
        }

        varPos++;

        if (charPos == (max - 1)) {
            charPos = 0;
        } else {
            charPos++;
        }
    }

    //


    for(int a = 0 ; a < max ; a++){

        for(int b = 0 ; b < max ; b++)
        {
            num_char[counter_char] = num_string[a].charAt(b);
            counter_char++;
        }
    }
//here is where the code should rotate the data





}

}

1 个答案:

答案 0 :(得分:1)

这是2D阵列的标准顺时针旋转90度。

我在下面提供了解决方案,但首先要提一些意见。

您说您正在这样做:

  1. 获取每行的输入并将其转换为字符串
  2. 将这些字符串拆分为单独的字符
  3. 将这些字符存储在数组中

首先,您实质上将int矩阵转换为字符矩阵。我认为您不需要这样做,因为即使您想比较值,也可以使用提供的整数。

第二,由于旋转不依赖任何值,因此不需要比较矩阵中的任何两个数据元素。

这是Java的一种适应性解决方案,最初是由Nick Berardi on this question用C#编写的。

private int[][] rotateClockWise(int[][] array) {
 int size = array.length;
 int[][] ret = new int[size][size];

 for (int i = 0; i < size; ++i) 
  for (int j = 0; j < size; ++j) 
   ret[i][j] = array[size - j - 1][i]; //***

 return ret;
}

如果您想进行反向CW旋转,请用

替换已加星号的行
ret[i][j] = matrix[j][size - i - 1]