当前位置: 首页 > 面试题库 >

对角遍历数组

靳金鹏
2023-03-14
问题内容

我有很多任意大小的数组。这是一个正方形阵列。我正在尝试掌握如何像a /而不是a 那样对角地遍历\(我已经知道该怎么做)。到目前为止,我有以下代码:

char[][] array = new char[500][500];
//array full of random letters
String arrayLine = "";
for (int y = 0; y < array.length; y++) {
    for (int x = 0; x < array.length; x++) {
        for (???) {
            arrayLine = arrayLine + array[???][???];
        }
    }
    System.out.println(arrayLine);
}

我有三个循环,因为这是我做另一个对角线的方式:

for (int y = 0; y < array.length; y++) {
    for (int x = 0; x < array.length; x++) {
        for (int z = 0; z < array.length-y-x; z++) {
            arrayLine = arrayLine + array[y+z][x+z];
        }
    }
    System.out.println(arrayLine);
}

在尝试中,我不断超越边界并获取ElementOutOfBounds异常。假设阵列如下(3x3而不是500x500):

A B C
D E F
G H I

我想将以下内容打印为字符串:

A
BD
CEG
FH
I

先前的SO问题对于整数数组也有类似的问题,解决方案基于数组元素的总和。但是我正在使用char,所以我想不出一种方法来获得它。


问题答案:

考虑一下单元的坐标:

. 0 1 2
0 A B C
1 D E F
2 G H I

对于任何对角线,所有元素都有一个共同点:元素坐标之和是一个常数。这是常量:

0 = 0+0 (A)
1 = 1+0 (B) = 0+1 (D)
2 = 2+0 (C) = 1+1 (E) = 0+2 (G)
3 = 2+1 (F) = 1+2 (H)
4 = 2+2 (I)

最小常数是最小坐标和0。最大常数是最大坐标和。由于每个坐标分量都可以上升到array.length - 1,因此最大常数为2 * (array.length - 1)

因此,要做的事情是遍历常量。对于每个常数,迭代其坐标总和为常数的元素。这可能是最简单的方法:

for (int k = 0; k <= 2 * (array.length - 1); ++k) {
    for (int y = 0; y < array.length; ++y) {
        int x = k - y;
        if (x < 0 || x >= array.length) {
            // Coordinates are out of bounds; skip.
        } else {
            System.out.print(array[y][x]);
        }
    }
    System.out.println();
}

但是,这将最终在许多边界坐标上进行迭代,因为它总是在所有可能的y坐标上进行迭代,即使只有一个对角线包含所有可能的y坐标。让我们更改y循环,使其仅访问ycurrent所需的坐标k

越界坐标的一种条件是x < 0。替换的定义x并解决:

x < 0
k - y < 0
k < y
y > k

因此,当时y > kx将为负。因此,我们只想循环while y <= k

越界坐标的另一个条件是x >= array.length。解决:

x >= array.length
k - y >= array.length
k - array.length >= y
y <= k - array.length

所以当时y <= k - array.lengthx将太大。因此,我们要从y0或开始k - array.length + 1,以较大者为准。

for (int k = 0; k <= 2 * (array.length - 1); ++k) {
    int yMin = Math.max(0, k - array.length + 1);
    int yMax = Math.min(array.length - 1, k);
    for (int y = yMin; y <= yMax; ++y) {
        int x = k - y;
        System.out.print(array[y][x]);
    }
    System.out.println();
}

注意:我仅证明此代码正确。我还没有测试



 类似资料:
  • Array类实现了迭代器,可使用迭代器对数组进行遍历,如果是数字索引数组,还可以直接使用for循环进行遍历。 数字索引数组 for(int i = 0; i < array.count(); i++) { php::echo("key=%d, value=%s.\n", i, array[i].toCString()); } 迭代器 for(auto i = array.begin();

  • 问题内容: 我正在尝试遍历JSON对象以导入数据,即标题和链接。我似乎无法掌握过去的内容。 JSON: 我尝试使用字典: 此代码仅在之前打印信息。( 忽略贾斯汀·比伯的曲目 :) 问题答案: 您加载JSON数据有些脆弱。代替: 您实际上应该这样做: 您不应该将“ JSON对象”视为什么。您所拥有的是清单。该列表包含两个字典。字典包含各种键/值对,所有字符串。当您这样做时,您将要求列表中的第一个字典

  • 问题内容: 我想知道是否有一个更好的方法来将此方法传递给该方法,或者在每次我想检查是否存在数字时将其写出更好。 例如: 我在这里先向您的帮助表示感谢! 问题答案: 您绝对应该将此逻辑封装到方法中。 多次重复相同的代码没有任何好处。 同样,如果将逻辑放在一种方法中并且它改变了,则只需在一个地方修改代码即可。 是否要使用第三方库是完全不同的决定。

  • 主要内容:遍历顺序,指定遍历顺序,修改数组元素值,外部循环使用,迭代多个数组NumPy 提供了一个 nditer 迭代器对象,它可以配合 for 循环完成对数组元素的遍历。 下面看一组示例,使用 arange() 函数创建一个 3*4 数组,并使用 nditer 生成迭代器对象。 示例1: 输出结果: 0 5 10 15 20 25 30 35 40 45 50 55 遍历顺序 在内存中,Numpy 数组提供了两种存储数据的方式,分别是 C-order(行优先顺序)与 F

  • 问题内容: 我有这个数组…如何打印每个文件路径和文件名?做这个的最好方式是什么? 问题答案: 使用无键循环 使用键循环 使用循环 是获取数组或对象快照的非常有用的功能。

  • Numpy 提供了一个迭代器对象 numpy.nditer,能够实现灵活地访问一个或者多个数组元素,达到遍历数组的目的。 1. 数组元素访问 1.1 按照内存布局打印数组元素 在默认情况下,numpy.nditer 迭代器返回的元素顺序,是和数组内存布局一致的,这样做是为了提升访问的效率,默认是行序优先。 案例 例如,我们对于新创建的 2×3 的数组,利用 nditer 迭代器进行顺序访问: ar