尽管你可能绝对不会在Job中使用类似的内容, 因为这根本没有意义, 但是对于年轻程序员的家庭作业来说, 这种练习非常普遍。这个想法很简单, 但是实现的方法不那么多, 你将拥有一个数组, 该数组在内部具有多个数组, 粗略地说是正方形或矩形, 任务是创建一个返回单个数组的函数。例如, 按照螺旋形式或众所周知的蜗牛顺序排列的项目将分析以下示例和预期结果:
// Example 1.
var matrix1 = [
[1, 2, 3], [4, 5, 6], [7, 8, 9]
]
// Expected = [1, 2, 3, 6, 9, 8, 7, 4, 5]
console.log(some_function(matrix1));
// Example 2.
var matrix2 = [
[1, 2 , 3, 4, 5 ], [6, 7 , 8 , 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]
]
// Expected = [1, 2, 3, 4, 5, 10, 15, 20, 19, 18, 17, 16, 11, 6, 7, 8, 9, 14, 13, 12]
console.log(some_function(matrix2));
如果仍然不明白, 请参阅本文图像中的图形说明, 在该图中你可以看到结构化数组后的箭头形状为蜗牛。
实现
给定的结构将始终是一个内部包含多个数组的单个数组, 因此你可以将其用作二次对象, 遍历每一行并根据生成的数组的状态使用一些标志返回到每一行:
/**
* Given a matrix of m x n elements (m rows, n columns), * return all elements of the matrix in spiral order.
* For example, * Given the following matrix:
* [
* [ 1, 2, 3 ], * [ 4, 5, 6 ], * [ 7, 8, 9 ]
* ]
*
*
* It should return [1, 2, 3, 6, 9, 8, 7, 4, 5].
*/
function spiral_traversal(array) {
var result = [];
if (array.length == 0 ){
return result;
}
var max = array[0].length -1;
// Grab the first row | result.push.apply(result, array[0])
for (var i=0;i<=max;i++){
result.push(array[0][i]);
}
// Grab the last column
for (var i=1;i< max;i++){
result.push(array[i][max]);
}
// Grab the last row
for (var i=max;i>=0;i--){
result.push(array[max][i]);
}
// Grab the first column
for (var i=max-1;i> 0;i--){
result.push(array[i][0]);
}
subarray = [];
// Form the inner matrix
for (var i=1;i<max;i++){
subarray.push(array[i].splice(1, max-1));
}
//call it recursively
result = result.concat( spiral_traversal(subarray) );
return result;
}
使用此功能, 你将能够以所需的形式构造原始数组:
var matrix1 = [
[1, 2, 3], [4, 5, 6], [7, 8, 9]
];
// Prints: [1, 2, 3, 6, 9, 8, 7, 4, 5]
console.log(spiral_traversal(matrix1));
编码愉快!
评论前必须登录!
注册