JavaScript

时间:2015-09-19 18:42:35

标签: javascript arrays algorithm

我正在处理编码问题并编写一个函数,该函数将以类似蜗牛的模式遍历嵌套数组(例如here)。

例如,给定[[1,2,3], [8,9,4], [7,6,5]]的输入,该函数应输出[1,2,3,4,5,6,7,8,9]

在我的main函数中,我创建了4个函数来遍历所有方向的数组。在每一步,我将值推到当前网格位置,并检查一个标志数组,以确定是否已访问过下一个位置。

我有两个问题:

  1. 我无法成功克隆作为参数传递的数组。即使我使用array.slice(0),新的flagsArray似乎也可以作为指向array的指针,当我修改flagsArray时,更改会反映在array中。那是为什么?
  2. 当我运行此测试时,我的克隆方法似乎有效:

    var array = [0, 1];
    var array_clone = array.slice(0);
    array_clone[2] = 3;
    console.log(array); // No changes to array
    
    1. 执行traverseDown()时出现flagsArray[(i + 1)] is undefined错误。这看起来像是尝试读取flagsArray之外的索引。但是,如果我在flagsArray[i + 1][j] === false && i < flagsArray.length循环中检查while,那么一旦尝试超出数组读取,循环就不应该停止吗?一个因为flagsArray[flags.Array.length]未定义,因此不等于false,另一个原因是我也检查i是否在flagsArray范围内。
    2. 这是我的功能:

      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]]));
      

1 个答案:

答案 0 :(得分:-1)

螺旋阵列(ES6)

尝试一下:

function spiral(array) {
    const matrix = [...array];
    const arr = [];

    while (matrix.length) {
        arr.push(
            ...matrix.shift(),
            ...matrix.map(a => a.pop()),
            ...matrix.pop().reverse(),
            ...matrix.map(a => a.shift()).reverse()
        );
    }
    return arr;
}