将列矩阵中的所有零移动到末尾

时间:2019-10-24 22:40:37

标签: javascript

我有以下矩阵

var matrix = [
    [2,    0,    0,  2],
    [4,    0,    0,  2],
    [2,    64,   32, 4],
    [1024, 1024, 64, 0]
];

我想将第一行和第二行的第二列和第三列中的零移动到末尾,但是我不知道该怎么做。这是我的尝试:

for(var i = 0; i < matrix.length; i++) {
    for(var j = 0; j < matrix.length ;j++) {
        //push zeroes to the end
        if(matrix[j][i] === 0){
            for(var k = j+1; k<2;k++){
                matrix[j][i] = matrix[k][i]
            }
            matrix[3][i] = 0
        }
    }
}

这是它返回的结果与我的期望值:

Returns:  [[2, 0,  0,  2], [4, 0,    0,  2], [2, 64, 32, 4], [1024, 0, 0, 0]]
Expected: [[2, 64, 32, 2], [4, 1024, 64, 2], [2, 0,  0,  4], [1024, 0, 0, 0]]

我将非常感谢您的帮助

3 个答案:

答案 0 :(得分:3)

要在每一列上移动零,您可以转置矩阵,移动每一行并将其转回:

let zip = a => a[0].map((_, i) => a.map(b => b[i]))

let shiftZeros = a => a.filter(x => x).concat(a.filter(x => !x))

//

let matrix = [
    [2,    0,    0,  2],
    [4,    0,    0,  2],
    [2,    64,   32, 4],
    [1024, 1024, 64, 0]
];

result = zip(zip(matrix).map(shiftZeros))

console.log(result.map(x => x.join()))

答案 1 :(得分:0)

您在这里:

function shift(m) {
  const length = m.length;
  for (let i = 0; i < length; i++) {
    for (let j = 0; j < length; j++) {
      if (m[i][j] === 0) {
        for (let ni = i + 1; ni < length; ni++) {
          if (m[ni][j] !== 0) {            
            [m[i][j], m[ni][j]] = [m[ni][j], m[i][j]];
            break;
          }
        }
      }
    }
  }
  return m;
}

var matrix = [[2,    0,    0,  2],
              [4,    0,    0,  2],
              [2,    64,   32, 4],
              [1024, 1024, 64, 0]];

console.log(shift(matrix).map(a => a.map(n => String(n).padStart(5, " "))).join("\n"))

答案 2 :(得分:0)

由于某些行是经过硬编码的,因此所提供的方法尚不清楚,但是它看起来确实像一个三重嵌套循环。这将不必要地在O(n 3 )时间运行。

一种有效的方法是使用两个指针-一个指向每个列的下一个零的交换位置,另一个指向当前元素。完成对列的遍历之后,将交换指针之后的所有内容清零。这需要O(n 2 )时间(我们访问矩阵中的每个元素一次)。

const zeroesToColEnd = matrix => {
  for (let col = 0; col < matrix.length; col++) {
    let i = 0;

    for (const row of matrix) {
      if (row[col]) {
        matrix[i++][col] = row[col];
      }
    }

    for (; i < matrix.length; matrix[i++][col] = 0);
  }
  
  return matrix;
};

const matrix = [[2,    0,    0,  2],
                [4,    0,    0,  2],
                [2,    64,   32, 4],
                [1024, 1024, 64, 0]];
const print = m => m.map(row => row.map(e => ("" + e).padStart(4, " ")).join("|")).join("\n");
console.log(print(zeroesToColEnd(matrix)));