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

Javascript 将列矩阵中的所有零移到末尾,javascript,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.lengt

我有下面的矩阵

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
        }
    }
}
非常感谢您的帮助

给您:

功能移位(m){
常数长度=m.长度;
for(设i=0;iconsole.log(shift(matrix).map(a=>a.map(n=>String(n).padStart(5,“”)).join(“\n”))
要将每列上的零移位,您可以将矩阵移位,将每行移位并将其转回:

let zip=a=>a[0].map(((uu,i)=>a.map(b=>b[i]))
设shiftZeros=a=>a.filter(x=>x).concat(a.filter(x=>!x))
//
设矩阵=[
[2,    0,    0,  2],
[4,    0,    0,  2],
[2,    64,   32, 4],
[1024, 1024, 64, 0]
];
结果=zip(zip(矩阵).map(shiftZeros))

console.log(result.map(x=>x.join())
由于某些行是硬编码的,所以给出的方法有点不清楚,但它看起来确实像一个三重嵌套的循环。这将在不必要的O(n3)时间内运行

一种有效的方法是使用两个指针——一个指向每列下一个零的交换位置,另一个指向当前元素。完成列的遍历后,将交换指针后的所有内容归零。这在O(n2)时间内运行(我们访问矩阵中的每个元素一次)

const zerostocolend=matrix=>{
for(设col=0;colm.map(row=>row.map(e=>(“+e).padStart(4)”).join(“|”).join(“\n”);

console.log(打印(zerostocolend(矩阵))我不明白这种转换是如何工作的。预期结果的第一行中没有零。你能解释一下操作这些的规则吗?我能知道“break”是做什么的吗?@user545871
break
立即结束一个循环,但你的命名有点不清楚:
row
是一个矩阵行,而
col
是一个列索引。谢谢。这些名字对我来说似乎很好——你建议我使用
colIdx
或其他东西来区分它们吗?在这一点上,这并不重要,但更有意义。
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]]