var sampleArray = [[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16],
[17,18,19,20]
];
function printSpiral(myArray, clockwise) {
//anti-clockwise:
//1,5,9,13,17, 18,19,20, 16,12,8,4, 3,2, 6,10,14, 15,11,7
if(!clockwise) {
myArray = transpose(myArray)
//console.log(myArray)
}
var rows = myArray.length;
var cols = myArray[0].length;
if(rows <= 1) {
return myArray[0];
}
if(cols === 0) {
return myArray[0];
}
var firstRow = myArray[0];
var newMatrix = [];
var newRow;
var rowIdx;
var colIdx = myArray[1].length - 1;
for(colIdx; colIdx >=0; colIdx--) {
newRow = [];
for(rowIdx = 1; rowIdx < rows; rowIdx++) {
newRow.push(myArray[rowIdx][colIdx])
//console.log(newRow)
}
newMatrix.push(newRow)
}
//console.log(newMatrix)
firstRow.push.apply(firstRow,printSpiral(newMatrix));
//console.log(firstRow)
return firstRow
//return newMatrix
// Spiral Order
// 1,2,3,4, 8,12,16,20, 19,18,17, 13,9,5, 6,7, 11,15, 14, 10
}
var result = printSpiral(sampleArray, false);
console.log(result)
我正在尝试以螺旋形但逆时针方向打印阵列。我已经尝试转置矩阵,但是这对我如何打印以下数组没有帮助。
// 1,5,9,13,17,18,19,20,16,12,8,4,3,2,6,10,14,15,11,7
请帮忙
最佳答案
它不是很优雅,但这是算法的关键:
<script>
var array = [[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16],
[17,18,19,20]];
function spiral(array) {
var list = [];
var array = array[0].map(function(col, i) {
return array.map(function(row) {
return row[i]
})
});
list.push(array[0]);
array.shift()
while (typeof array[0] !== 'undefined'){
var array = array[0].map(function(col, i) {
return array.map(function(row) {
return row[i]
})
});
array.reverse();
list.push(array[0]);
array.shift();
}
return list
}
var list = spiral(array)
document.writeln(list);
</script>
基本的想法如下,通过移调和翻转完成逆时针旋转90度。然后我们弹出第一行,然后再次执行。
所以我们转置数组array.reverse来翻转它,将我们的行推入列表,array.shift弹出该行,然后重复。
这种方法的主要好处还在于,它不会关心数组的尺寸。它们可以不对称。