【发布时间】:2015-09-19 18:42:34
【问题描述】:
我正在解决一个编码问题并编写一个函数,该函数将以类似蜗牛的模式遍历嵌套数组(例如 here)。
例如,给定输入[[1,2,3], [8,9,4], [7,6,5]],函数应该输出[1,2,3,4,5,6,7,8,9]。
在我的 main 函数中,我创建了 4 个函数来全方位遍历数组。在每一步中,我都会在当前网格位置推送值并检查标志数组以确定是否已访问下一个位置。
我有两个问题:
- 我无法成功克隆作为参数传递的数组。即使我使用了
array.slice(0),新的flagsArray似乎也充当了指向array的指针,当我修改flagsArray时,更改会反映在array中。这是为什么呢?
当我运行这个测试时,我的克隆方法似乎奏效了:
var array = [0, 1];
var array_clone = array.slice(0);
array_clone[2] = 3;
console.log(array); // No changes to array
- 我在执行 traverseDown() 时收到
flagsArray[(i + 1)] is undefined错误。这看起来像是试图读取超出flagsArray的索引。但是,如果我在while循环中检查flagsArray[i + 1][j] === false && i < flagsArray.length,那么循环是否应该在尝试读取数组之外时停止?一方面是因为flagsArray[flags.Array.length]未定义,因此不等于false,另一个原因是我还要检查i是否在flagsArray范围内。
这是我的功能:
snail = function(array) {
console.log(array);
var output = [];
var flagsArray = array.slice(0);
// Populating flagsArray with false values
// False = index not visited yet
for (var i = 0; i < flagsArray.length; i++) {
for (var j = 0; j < flagsArray[i].length; j++) {
flagsArray[i][j] = false;
}
}
var i = 0;
var j = 0;
var traverseRight = function() {
while (flagsArray[i][j + 1] === false && j < flagsArray[i].length) {
console.log(flagsArray[i][j].length + 'Traversing right Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
j++;
}
}
var traverseDown = function() {
while (flagsArray[i + 1][j] === false && i < flagsArray.length) {
console.log('Traversing Down Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
i++;
}
}
var traverseLeft = function() {
while (array[i][j - 1] === false && j >= 0) {
console.log('Traversing left Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
j--;
}
}
var traverseUp = function() {
while (array[i][j] === false && j >= 0) {
console.log('Traversing Up Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
i--;
}
}
while (flagsArray[i][j + 1] === false) {
traverseRight();
traverseDown();
traverseLeft();
traverseUp();
}
return output;
}
console.log(snail([[1,2,3],[8,9,4],[7,6,5]]));
【问题讨论】:
标签: javascript arrays algorithm