说在前面
🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->将一维数组转变成二维数组
问题描述
给你一个下标从 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 * 10^4
1 <= original[i] <= 10^5
1 <= m, n <= 4 * 10^4
思路分析
首先我们应该要先理解一下题目意思,题目会给我们一个一维数组original
,和两个整数 m
和 n
,我们需要使用 original
中 所有 元素创建一个 m
行 n
列的二维数组。第一行包含original
中下标0 ~ n
n 个元素,第二行包含original
中下标n ~ 2 * n
n 个元素,第 i 行包含original
中下标(i - 1) * n ~ i * n
n 个元素……相当于我们要对一维数组进行切割,每n
个元素切割为一整块作为一行。
我们需要先判断给定数组能否刚好创建一个 m
行 n
列的二维数组,如果不能,我们直接返回一个空数组。
if (m * n !== original.length) return [];
生成一个 m
行 n
列的二维数组,将一维数组中的元素填写到二维数组中对应的位置上,二维数组中第 i
行 j
列的元素应该对应一维数组中第 i * n + j
个元素。
const res = new Array(m);
for (let i = 0; i < m; i++) {
res[i] = new Array(n);
for (let j = 0; j < n; j++) {
res[i][j] = original[i * n + j];
}
}
AC 代码
完整 AC 代码如下:
/**
* @param {number[]} original
* @param {number} m
* @param {number} n
* @return {number[][]}
*/
var construct2DArray = function (original, m, n) {
if (m * n !== original.length) return [];
const res = new Array(m);
for (let i = 0; i < m; i++) {
res[i] = new Array(n);
for (let j = 0; j < n; j++) {
res[i][j] = original[i * n + j];
}
}
return res;
};
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。