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弹出该行,然后重复。

这种方法的主要好处还在于,它不会关心数组的尺寸。它们可以不对称。

10-05 21:39