我有以下矩阵
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]]
我将非常感谢您的帮助
答案 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)));