编码非常新,请耐心等待。我正在尝试解决Codewars上的这个Kata:https://www.codewars.com/kata/snail/train/javascript
基本上给定一个像
[
[1, 2, 3, 4],
[12,13,14,5],
[11,16,15,6],
[10,9, 8, 7]
];
它将返回
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
。蜗牛的踪迹绕着矩阵的外部向内盘旋。
我只是在解决矩阵为n x n的情况,其中n> 1且为偶数。
我通过在函数外部声明outputarray来使其工作,但我希望在函数内部声明该数组,因此包含以下行:
var outputarray = outputarray || [];
不知道我要去哪里错了。
snail = function(array) {
if (array.length == 0) {
return outputarray
}
var n = array[0].length - 1;
var outputarray = outputarray || [];
for (var i = 0; i <= n; i++) {
outputarray.push(array[0].splice(0, 1));
}
for (var i = 1; i <= n; i++) {
outputarray.push(array[i].splice(n, 1));
}
for (var i = n - 1; i >= 0; i--) {
outputarray.push(array[n].splice(i, 1));
}
for (var i = n - 1; i > 0; i--) {
outputarray.push(array[i].splice(0, 1));
}
array.pop();
array.shift();
snail(array);
}
最佳答案
一种选择是在snail
内定义另一个函数,该函数以递归方式调用自身,同时还在outputarray
内定义snail
。这样,outputarray
不会暴露给外部作用域,但是递归函数仍然可以看到它。
还要注意,splice
返回一个数组,所以现在,您的outputarray
由一个数组组成。而是扩展为push
对其进行修复,以使outputarray
成为数字数组:
const input = [
[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]
];
const snail = (array) => {
const outputarray = [];
const iter = () => {
if (array.length == 0) {
return
}
var n = array[0].length - 1;
for (var i = 0; i <= n; i++) {
outputarray.push(...array[0].splice(0, 1));
}
for (var i = 1; i <= n; i++) {
outputarray.push(...array[i].splice(n, 1));
}
for (var i = n - 1; i >= 0; i--) {
outputarray.push(...array[n].splice(i, 1));
}
for (var i = n - 1; i > 0; i--) {
outputarray.push(...array[i].splice(0, 1));
}
array.pop();
array.shift();
iter(array);
};
iter(array);
return outputarray;
}
console.log(snail(input));