java - 如何在 Java 中旋转二维数组
问题描述
[解决了]
这个问题的标题含糊不清,但希望这能澄清问题。
基本上,我正在寻找的是旋转这组数据的解决方案。此数据以特定方式设置。
以下是输入和输出的示例:
输入:
3
987
654
321
输出:
123
456
789
“3”表示将使用的列数和行数。如果您输入数字“4”,您将被允许输入 4 组 4 个整数。
输入:
4
4567
3456
2345
1234
输出:
1234
2345
3456
4567
目标是找到一种仅在需要时才轮换数据的方法。您必须确保最小的角编号在左上角。例如,对于上面的代码,您旋转了它,使 1 位于左上角。
我遇到的问题是我不知道如何旋转数据。我只能旋转角落,但不能旋转侧面。到目前为止,这就是我的代码所做的:
- 获取每一行的输入并将它们转换为字符串
- 将这些字符串拆分为单独的字符
- 将这些字符存储在数组中
我只是不知道如何比较这些字符并最终旋转数据。
任何帮助,将不胜感激!任何问题都会得到解答。
问题的详细描述在此处(问题 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
}
}
解决方案
这是 2D 阵列的标准 90 度顺时针旋转。
我在下面提供了解决方案,但首先是一些评论。
你说你正在这样做:
- 获取每一行的输入并将它们转换为字符串
- 将这些字符串拆分为单独的字符
- 将这些字符存储在数组中
首先,您实际上是将 int 矩阵转换为字符矩阵。我认为您不需要这样做,因为即使您确实想比较值,也可以使用提供的整数。
其次,不需要比较矩阵中的任何两个数据元素,因为旋转不依赖于任何值。
这是一个适用于 java 的解决方案,最初由Nick Berardi 在这个问题上用 C# 编写
private int[][] rotateClockWise(int[][] matrix) {
int size = matrix.length;
int[][] ret = new int[size][size];
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
ret[i][j] = matrix[size - j - 1][i]; //***
return ret;
}
如果您想进行逆时针旋转,请将星号线替换为
ret[i][j] = matrix[j][size - i - 1]
推荐阅读
- php - 删除上传目录中的文件
- python - python stopable sched 在单独的线程中
- r - 在 R 中,Cut 在 1 到 9 和 0.1 到 0.9 的范围内产生不等的间隔
- amazon-ses - 如何将 MailAttachment 转换为 MimeKit 附件
- linux - Bash 脚本 - 无法解决代码“帮助”错误
- server - NVIDIA-SMI 失败,因为它无法与 NVIDIA 驱动程序通信。确保已安装并运行最新的 NVIDIA 驱动程序
- azure - 获取从 Visual Studio 作为 zip 发布的函数应用的 API 定义
- javascript - 未捕获的 RangeError:超过最大调用堆栈大小..禁用并检查不工作
- python - 如何在 django.test.TestCase 类设置函数中使用 pytest `request.config`
- reactjs - 反应最终形式。如何从组件状态设置字段值