开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
题目 leetcode.cn/
- 给你一个下标从 0 开始的一维整数数组
original和两个整数m和n。你需要使用original中 所有 元素创建一个m行n列的二维数组。 original中下标从0到n - 1(都 包含 )的元素构成二维数组的第一行,下标从n到2 * n - 1(都 包含 )的元素构成二维数组的第二行,依此类推。- 请你根据上述过程返回一个 **
m x n的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。
示例
- 示例 1:
-
输入: 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 * 1000001 <= original[i] <= 10000001 <= 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,但是批量选中的时候有可能选中几百条甚至更多,这个时候就需要自己来做分组了。