【问题标题】:Traverse 2D Array (Matrix) Diagonally对角线遍历二维数组(矩阵)
【发布时间】:2011-02-21 05:04:58
【问题描述】:

所以我发现this 线程对于沿对角线遍历数组非常有帮助。我被困在镜像它上。例如:

var m = 3;
var n = 4;
var a = new Array();
var b = 0;

for(var i = 0; i < m; i++) {
  a[i] = new Array(n);
  for(var j = 0; j < n; j++) {
    a[i][j] = b;
      b++;
  }
}

for (var i = 0; i < m + n - 1; i++) {
  var z1 = (i < n) ? 0 : i - n + 1;
  var z2 = (i < m) ? 0 : i - m + 1;
  for (var j = i - z2; j >= z1; j--) {
    console.log(a[j][i - j]);
  }
}

控制台读取[[0],[4,1],[8,5,2],[9,6,3],[10,7],[11]]

我希望它阅读[[8],[4,9],[0,5,10],[1,6,11],[2,7],[3]]

被难住了一阵子,就像魔方一样>_

【问题讨论】:

  • 不,自学程序员......不再在学校了。也许我应该回去:P

标签: javascript matrix multidimensional-array


【解决方案1】:

嗯,我发现整个 z1、z2 逻辑有点不可读,所以我做了一点不同:

var m = 3;
var n = 4;
var a = new Array();
var b = 0;

for(var i = 0; i < m; i++) {
  a[i] = new Array(n);
  for(var j = 0; j < n; j++) {
    a[i][j] = b;
      b++;
  }
}

var out = new Array();
for (var i = 1 - m; i < n; i++) {
    var group = new Array();
    for (var j = 0; j < m; j++) {
        if ((i + j) >= 0 && (i + j) < n) {
            group.push(a[j][i + j]);
        }
    }
    out.push(group);
}
console.log(out);

[[8], [4, 9], [0, 5, 10], [1, 6, 11], [2, 7], [3]] 打印到控制台。

工作原理

您的矩阵构造为您提供了一个像这样的矩形(您的 a 数组是行集):

0 1 2 3 4 5 6 7 8 9 10 11

这意味着对角线在这个网格上:

# # 0 1 2 3 # 4 5 6 7 # 8 9 10 11 # #

现在我们只是在一个倾斜的矩形上循环,看起来像这样标准化:

# # 0 1 2 3 # 4 5 6 7 # 8 9 10 11 # #

现在您会注意到,对于您添加的每一行,您最终都会得到一个额外的列(以 # 开头),并且第一列现在倾斜了这个数量(如果您想象将第一行保留在将下面的行放置并滑动到左侧)。所以对于我们的外部for 循环(在列上),第一列实际上是旧的第一列0,减去行数m,加上1,得到0 - m + 1 或@987654330 @。最后一列有效地保留在原地,所以我们仍在循环到n。然后,只需获取每一列并遍历 m 的每一行(内部 for 循环)。

当然这会给你留下一堆undefineds(上面网格中的#s),但我们可以用简单的if跳过它们,以确保我们的i和@987654338 @ 在mn 范围内。

可能比z1/z1 版本的效率略低,因为我们现在循环遍历冗余的# 单元而不是预先计算它们,但它不应该对现实世界产生任何影响&我认为代码最终变得更具可读性。

【讨论】:

  • 我同意,这很好地解释了它背后的逻辑。非常感谢!
【解决方案2】:
/*
Initialize the 2-D array.
*/      
String array2D[] = { 
                    "mvjlixape",
                    "jhbxeenpp",
                    "hktthbswy",
                    "rwainuyzh",
                    "ppfxrdzkq",
                    "tpnlqoyjy",
                    "anhapfgbg",
                    "hxmshwyly",
                    "ujfjhrsoa" 
                    };
    // Print 2D array diagonally  for left top to right down
            for(int j = 0; j < array2D.length; j ++){
                for(int i = 0; i < array2D.length; i++){
                    if(i+j >= array2D.length)
                        break;
                    System.out.print(array2D[i].charAt(i+j));
                }
                System.out.println();
            }
            for(int j = 1; j < array2D.length; j ++){
                for(int i = 0; i < array2D.length; i++){
                    if(i+j >= array2D.length)
                        break;
                    System.out.print(array2D[i + j].charAt(i));
                }
                System.out.println();
            }

            // Print diagonally right top to left bottom diagonal
            for(int j = 0; j < array2D.length; j++){
                for(int i = j; i >= 0; i--){
                    System.out.print(array2D[j - i].charAt(i));
                }
                System.out.println();
            }
            for(int j = 1; j < array2D.length; j ++){
                for(int i = j; i < array2D.length; i++){
                    System.out.print(array2D[array2D.length - i + j - 1].charAt(i));
                }
                System.out.println();
            }

【讨论】:

  • 这里我将打印数组对角线分成四部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多