【问题标题】:Algorithm: Is it possible to sweep(iterate line, column, diagonal and reverse diagonal) a simple array?算法:是否可以扫描(迭代行、列、对角线和反向对角线)一个简单的数组?
【发布时间】:2021-09-10 01:14:16
【问题描述】:

给定一个简单的矩阵,而不是二维数组,是否可以在不转换为矩阵(二维数组)的情况下迭代对角线和逆对角线?或者对于对角线,我们是否总是需要转换为二维矩阵?

例如使用Java Stream:

给定一个简单数组:

private static final String[] SIMPLE_ARRAY = new String[] {
            "CTGAGA",
            "CTGAGC",
            "TAGTGT",
            "AGAGGG",
            "CCCETA",
            "TCACTG"
    };

打印线:

Arrays.stream(SAMPLE_DATA).forEach(System.out::println);

输出:

CTGAGA
CTGAGC
TAGTGT
AGAGGG
CCCETA
TCACTG

打印列:

IntStream.range(0, SAMPLE_DATA.length).mapToObj(col ->
     Arrays.stream(SAMPLE_DATA).reduce("", (acc, row) -> acc + row.charAt(col))
).forEach(System.out::println);

输出:

CCTACT
TTAGCC
GGGACA
AATGEC
GGGGTT
ACTGAG

打印对角线: ?

打印反对角线: ?

【问题讨论】:

  • 这个问题似乎与 Java 紧密相关,或者至少与语言有关。在某些语言中,这将非常容易,而在其他语言中则更难,并且可能有些地方您需要切换到 2D 数组或类似语言。

标签: arrays algorithm matrix data-structures


【解决方案1】:

使用相同的方法(使用流),您可以获得对角线:

int n = SIMPLE_ARRAY.length;
// Diagonal 1
IntStream.range(0, n)
         .mapToObj(i -> SIMPLE_ARRAY[i].charAt(i))
         .forEach(System.out::println);
// Diagonal 2
IntStream.range(0, n)
         .mapToObj(i -> SIMPLE_ARRAY[i].charAt(n-1-i))
         .forEach(System.out::println);

【讨论】:

    【解决方案2】:

    您的数组是 1D 或 2D 的事实并没有太大变化,每个 2D 索引 [i][j] 都可以转换为 1D [i*nCols+j],从 1D 索引到 2D 索引也可以使用模数。您的字符串就像一个数组,即使在 Java 中也是如此,但您必须使用 charAt(i) 而不是使用 [i],因此在语义上您的 String[] 可以像 char[][] 一样迭代。

    迭代对角线的一般算法是,for循环包含在内:

    For d = 0 to min(nRows, nCols) - 1: // min if the matrix is not a square
        i=d
        j=0
        For k = 0 to d: // iterate each element of the d-th diagonale
            // Do something with row i and col j
            i--
            j++
    

    通过交换一些索引或使用 (i, nCols - j -1) 代替 (i, j) 的反向对角线大致相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2018-06-20
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多