首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取矩阵数组对角线的Javascript

获取矩阵数组对角线的Javascript
EN

Stack Overflow用户
提问于 2016-02-13 07:26:08
回答 3查看 3.9K关注 0票数 1

我想用javascript得到矩阵数组的所有对角线。假设输入和输出如下:

代码语言:javascript
复制
input = [
  [1,2,3],
  [4,5,6],
  [7,8,9],
]

output = [
  [1],
  [4,2],
  [7,5,3],
  [8,6],
  [9],
]

如何将输入转换为输出?我怎么做才能使它适用于任何大小的正方形网格(2x2,3x3,4x4等)?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-10-24 16:47:33

代码语言:javascript
复制
const arr = [
    [11, 2, 4],
    [4, 5, 6],
    [10, 8, 12]
];
function diagonalDifference(arr) {
    const  primaryDiagonal = arr
        .map((e, i) => e[i])
        .reduce((mem, curr) => mem + curr, 0);
    const secondaryDiagonal = arr
        .map((e, i) => {
            let index = arr.length - i -1;
            return e[index];
        })
        .reduce((mem, curr) => mem + curr, 0);
    return Math.abs(primaryDiagonal - secondaryDiagonal);
}
console.log(diagonalDifference(arr));
票数 1
EN

Stack Overflow用户

发布于 2016-02-13 08:40:12

我想到的第一种方法(不一定是最好的方法)就是让一个循环沿着正方形的左边缘运行,然后是一个循环沿着正方形的底部边缘运行。换句话说,我写的代码完全是我手动获得对角线时所做的事情,没有经过巧妙的优化。

请注意,这应该适用于任何大小的正方形,但不会尝试处理矩形:我将其留给读者作为练习。

代码语言:javascript
复制
function getDiagonals(m) {
  var s, x, y, d,
      o = [];
  for (s = 0; s < m.length; s++) {
    d = [];
    for(y = s, x = 0; y >= 0; y--, x++)
      d.push(m[y][x]);
    o.push(d);
  }
  for (s = 1; s < m[0].length; s++) {
    d = [];
    for(y = m.length - 1, x = s; x < m[0].length; y--, x++)
      d.push(m[y][x]);
    o.push(d);
  }
  return o;
}

var output = getDiagonals(input);

我对它进行了几次简短的测试,它似乎可以工作,但您可以自己尝试使用this demo

票数 0
EN

Stack Overflow用户

发布于 2016-02-13 09:28:48

您可以使用以下命令:

代码语言:javascript
复制
var output = new Array(2*input.length-1);
for(var i=0; i<output.length; ++i) {
  output[i] = [];
  if(i < input.length) for(var j=0; j<=i; ++j)
    output[i].push(input[i-j][j]);
  else for(var j=input.length-1; j>i-input.length; --j)
    output[i].push(input[j][i-j]);
}

或者这样:

代码语言:javascript
复制
var output = new Array(2*input.length-1);
for(var i=0; i<output.length; ++i) {
  output[i] = [];
  for(var j=Math.min(i, input.length-1); j>Math.max(-1, i-input.length); --j)
    output[i].push(input[j][i-j]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35373936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档