有趣的数组打印


题目及示例


输入m,n打印出相应的数据

例:
m=5,n=7

1 10 11 20 21 26 31
2 9 12 19 22 27 32
3 8 13 18 23 28 33
4 7 14 17 24 29 34
5 6 15 16 25 30 35

解题思路


  • 创建一个空的二维数组res=[[ ],[ ]…]
  • 先利用for循环创建正序数组放入刚刚创建好的二维数组中
  • 即[ [1,2,3,4,5]….[31,32,32,34,35] ]
  • 创建过程中寻找到res中的下标为奇数的项数进行反转,此时res=[[1,2,3,4,5],[10,9,8,7,6]…]
  • 此时创建新的二维数组newres=[[ ],[ ]…] ,再对原二维数组res进行90度旋转并将元素放入newres中去
  • 此时newres=[ [1,10,11,20,21,26,31]…],此时进行解构打印即可

代码展示

var shortestCompletingWord = function (m, n) {
    let res = new Array(n).fill([]).map(() => new Array(m).fill())
    for (let i = 1; i <= n; i++) {
        for (let j = 1; j <= m; j++) {
            res[i - 1][j - 1] = j + m * (i - 1)
        }
        if (i - 1 < res[i - 1].length && (i - 1) % 2 != 0) {
            res[i - 1] = res[i - 1].reverse()
        }
    }
    let newres = new Array(m).fill([]).map(() => new Array(n).fill())
    for (let i = 0; i < res.length; i++) {
        for (let j = 0; j < res[i].length; j++) {
            newres[j][i] = res[i][j]
        }
    }
    for (let i = 0; i < newres.length; i++) {
        console.log(...newres[i])
    }
}
shortestCompletingWord(5, 7)

1 10 11 20 21 26 31
2 9 12 19 22 27 32
3 8 13 18 23 28 33
4 7 14 17 24 29 34
5 6 15 16 25 30 35

注意事项


fill()方法直接进行创建创建数组会出现如下问题

let arr = new Array(2).fill(new Array(2).fill(0))
arr = [[0,0],[0,0]]
arr[1][1] = 1
arr = [[0,1],[0,1]]

原因为fill()的参数不是基本类型时,比如数组、对象,并不是将它的值填充到数组,而是将它的地址填充到数组,所以填充后数组的每一项都指向的是同一个对象(类似于浅拷贝),会出现”牵一发而动全身”的现象



创建二维数组时应以下方式创建

let arr = new Array(n).fill([]).map(() => new Array(m).fill())


文章作者: liwenka1
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liwenka1 !
  目录