gpt4 book ai didi

java - 通过对角遍历具有左倾对角线部分的二维数组来获取数组列表?

转载 作者:行者123 更新时间:2023-12-02 10:15:20 25 4
gpt4 key购买 nike

我知道我可以使用for (int i = 0; i < myArray.length; i++)或增强的 for 循环来完全迭代循环。

但是,我尝试通过对角二维数组完全迭代来创建新的 char[] 数组,同时采用左倾部分(而不是通常的右倾部分)。

换句话说,请看下图。我希望每个 char[] 数组由下图中两条红色对角线之间的所有字符组成。

enter image description here

因此,如果迭代从右上角开始,则第一个数组将是 ['q'] ,第二个是 ['e', 'w'] ,第三个,['d', 'j', 'e']等等

这是图表代码:

private static char[][] bigArray = {
{'a', 'b', 'c', 'd', 'e', 'q'},
{'f', 'g', 'h', 'i', 'j', 'w'},
{'k', 'l', 'm', 'n', 'o', 'e'},
{'p', 'q', 'r', 's', 't', 'r'},
{'u', 'v', 'w', 'x', 'z', 't'}};

尝试迭代左倾对角线使得很难始终知道我正在使用的数组的长度。特别是因为我创建的新 char[] 数组的长度不同。

有没有办法让 java 停止对我创建的每个数组进行特定长度的迭代?

最佳答案

Trying to iterate left-leaning diagonals makes it difficult to always know the length of the array I am using. Especially since the new char[] arrays I create will be of different lengths.

根据您在矩阵 bigArray 中的当前位置计算对角线长度(新 char[] 的大小)(使用索引 ij)执行此操作

int newCharArrayLength = Math.min(height - i, width - j);

实现(解释如下)

private static List<char[]> getDiagonalsList(char[][] arr) {
List<char[]> ans = new ArrayList<>();
int height = arr.length;
int width = arr[0].length;
int numberOfDiagonals = arr.length + arr[0].length - 1;

for (int diagonalIdx = 0; diagonalIdx < numberOfDiagonals; diagonalIdx++) {
int i = Math.max(diagonalIdx - width + 1, 0);
int j = Math.max(width - diagonalIdx - 1, 0);
int currentDiagonalLength = Math.min(height - i, width - j);
int idx = 0;

char[] charArr = new char[currentDiagonalLength];
while (i < height && j < width)
charArr[idx++] = arr[i++][j++];

ans.add(charArr);
}

return ans;
}

一个函数

您可以编写一个像这样的main函数来输出结果

public static void main(String[] args) {
char[][] arr = {
{'a', 'b', 'c', 'd', 'e', 'q'},
{'f', 'g', 'h', 'i', 'j', 'w'},
{'k', 'l', 'm', 'n', 'o', 'e'},
{'p', 'q', 'r', 's', 't', 'r'},
{'u', 'v', 'w', 'x', 'z', 't'}};

for (char[] diag : diagonal(arr))
System.out.println(diag);
}

输出

结果将如下所示

q
ew
dje
cior
bhntt
agmsz
flrx
kqw
pv
u

解释和算法

  1. 初始化 char[]列表。这是您在每次迭代时放置对角线的位置
  2. 计算矩形的总numberOfDiagonals。您可以通过将宽度和高度相加减一(重复角)来实现此目的
  3. 计算您的 i 指数。这可以通过从对角线索引减去矩形的宽度减一来完成(因为我们从 0 开始索引)。该指数应始终为正
  4. 计算您的 j 指数。与之前的原理相同,但您需要反转减法,因为我们需要反向对角线。这也需要是积极的
  5. 计算您的currentDiagonalLength。为此,较小当前行 (i) 与高度之间的距离或当前列 (j) 和宽度
  6. 初始化一个数组,用于保存具有先前计算的长度的对角线
  7. 一项一项地添加项目。每次迭代都会增加您的当前行i当前列j
  8. 将该数组附加到第 1 步中提到的列表
  9. 重复第 3 步第 8 步,直到完成所有对角线

关于java - 通过对角遍历具有左倾对角线部分的二维数组来获取数组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54725326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com