JS面试题之——数组转置与螺旋矩阵

数组转置


题目描述

输入:一个二维数组,例如:

    [ [1,2,3] , [4,5,6] , [7,8,9] ]

输出:二维数组的转置

    [ [1,4,7] , [2,5,8] , [3,6,9] ]

思路

    矩阵的转置就是行列互换

代码如下

function arrayT(sArray){

    var tArray = [];

    //对目标数组初始化

    for(var i = 0; i < sArray[0].length; i++){

        tArray[i] = [];

    }

    //转置数组

    for(var i = 0; i < sArray.length; i++){

        for(var j = 0; j < sArray[i].length; j++){

            tArray[j][i] = sArray[i][j];

        }

    }

    return tArray;

}

注:

    这是一道本人经历的面试题,题目要求是给一个字符串,"abc def ghi",输出为"adg beh cfi"。

    通过这个面试题,我想到了数组的转置操作。

螺旋矩阵


该题是在数组转置的基础上,我想到了之前leetcode上的一道题目,就重温一下。

题目描述

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

输入:

[

    [ 1 , 2 , 3 ] ,

    [ 4 , 5 , 6 ] ,

    [ 7 , 8 , 9 ]

]

输出:

[ 1 , 2 , 3 , 6 , 9 , 8 , 7 , 4 , 5]

思路分析

其实是相当于每次遍历完外圈,然后遍历内圈;

我们可以把遍历每一圈作为一个完整的事件,然后不断去重复遍历每一圈就可以解决这个问题。

其实就是递归的运用。

代码实现

arr => {

    // map函数用来完成当前矩阵最外一圈的遍历

    // 二维数组 arr 表示当前矩阵

    // 一维数组 result 用来保存遍历结果 

    let map = (arr, result) => {

        // 矩阵的高度即行数

        let n = arr.length

        // 遍历矩阵的每一行

        for(let i = 0; i < n; i++){

            // 若第一行 按顺序插入

            if(i === 0){

                result = result.concat(arr[i])

            } else if (i === n-1){

                // 若最后一行 倒序插入

                result = result.concat(arr[i].reverse())

            } else {

                // 若中间行 插入该行最后一个元素 并将该元素从矩阵中删除

                result.push(arr[i].pop())

            }

        }

        // 将已经遍历的第一行和最后一行从矩阵中删除

        arr.pop()

        arr.shift()

        // 遍历插入最左侧一列 此时删除首位两行后矩阵高度已变为n-2

        for(let j = n - 3; j >= 0; j--){

            // 避免arr[j]长度为空时插入undefined

            if(arr[j].length){

                result.push(arr[j].shift())

            }

        }

        // 截止条件 矩阵有元素就继续递归

        if(arr.length){

            // 把已将遍历元素删除的矩阵进行递归

            return map(arr, result)

        }else{

            return result

        }

    }

    // 将初始矩阵传入, 保存结果的数组初始为空

    return map(arr, [])

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.用js实现随机选取10~100之间的10个数字,存入一个数组,并排序 //要是获取不重复的,则对随机数...
    persistlu阅读 5,628评论 0 0
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,402评论 0 2
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,728评论 0 89
  • 参考:十大经典排序算法 0、排序算法说明 0.1排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明...
    谁在烽烟彼岸阅读 1,028评论 0 12
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 675评论 0 0