2022. 将一维数组转变成二维数组

197 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和  n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。
  • original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都 包含 )的元素构成二维数组的第二行,依此类推。
  • 请你根据上述过程返回一个 **m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。

示例

  • 示例 1:

image.png

  • 输入: original = [1,2,3,4], m = 2, n = 2

  • 输出: [[1,2],[3,4]]

  • 解释: 构造出的二维数组应该包含 2 行 2 列。

    • original 中第一个 n=2 的部分为 [1,2] ,构成二维数组的第一行。
    • original 中第二个 n=2 的部分为 [3,4] ,构成二维数组的第二行。
  • 示例 2:

    • 输入: original = [1,2,3], m = 1, n = 3
    • 输出: [[1,2,3]]
    • 解释:构造出的二维数组应该包含 1 行 3 列。将 original 中所有三个元素放入第一行中,构成要求的二维数组。
  • 示例 3:

    • 输入: original = [1,2], m = 1, n = 1
    • 输出: []
    • 解释: original 中有 2 个元素。无法将 2 个元素放入到一个 1x1 的二维数组中,所以返回一个空的二维数组。
  • 示例 4:

    • 输入: original = [3], m = 1, n = 2
    • 输出: []
    • 解释:original 中只有 1 个元素。无法将 1 个元素放满一个 1x2 的二维数组,所以返回一个空的二维数组。

提示:

  • 1 <= original.length <= 5 * 100000
  • 1 <= original[i] <= 1000000
  • 1 <= m, n <= 4 * 100000

代码

function construct2DArray(original: number[], m: number, n: number): number[][] {
    if(m * n !== original.length) return [];
    let result = [];
    for(let k = 1; k <= m; k++){
        result.push(original.splice(0, n));
    }
    return result;
};
  • 截取法:

    • 一个 m 行 n 列的二维数组代表的就是二维数组的长度为m,即有m个子数组,而每个子数组的长度为n
    • 要想组成一个m * n 的二维矩阵,并且不能有位置空出来,那么m * n的结果一定等于数组original内元素的个数,所以可以先判断m * n是否等于original.length,如果不相等,那么一定不能转变为二维数组,直接返回空数组
    • 先定义一个保存结果的变量,按照给定变量m循环遍历,m代表子数组的个数,每一个子数组内都有n个值,在每次遍历的时候确定第k个子数组内的值
    • 确定第k个子数组的值可以调用数组的splice方法,当传入两个参数的时候,这个方法会从原数组中删除部分元素,传入的第一个参数代表从那个下标开始删除,传入的第二个参数代表删除多少个,并且会改变原数组,返回一个包括删除元素的新数组,这里每次都从下标为0开始删除,每次删除n
    • 最后将每次删除返回的数组push到之前定义的数组变量中,返回结果
  • 刚好上周遇到过这个问题,在做后台管理系统的时候要做个批量操作,后台给的接口是一次最多传20个数据id,但是批量选中的时候有可能选中几百条甚至更多,这个时候就需要自己来做分组了。

结果

image.png