说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给定一个数组 arr 和一个块大小 size ,返回一个 分块 的数组。分块 的数组包含了 arr 中的原始元素,但是每个子数组的长度都是 size 。如果 arr.length 不能被 size 整除,那么最后一个子数组的长度可能小于 size 。
你可以假设该数组是 JSON.parse 的输出结果。换句话说,它是有效的JSON。
请你在不使用 lodash 的函数 _.chunk 的情况下解决这个问题。
示例 1:
输入:arr = [1,2,3,4,5], size = 1 输出:[[1],[2],[3],[4],[5]] 解释:数组 arr 被分割成了每个只有一个元素的子数组。
示例 2:
输入:arr = [1,9,6,3,2], size = 3 输出:[[1,9,6],[3,2]] 解释:数组 arr 被分割成了每个有三个元素的子数组。然而,第二个子数组只有两个元素。
示例 3:
输入:arr = [8,5,3,2,6], size = 6 输出:[[8,5,3,2,6]] 解释:size 大于 arr.length ,因此所有元素都在第一个子数组中。
示例 4:
输入:arr = [], size = 1 输出:[] 解释:没有元素需要分块,因此返回一个空数组。
提示:
- arr 是一个有效的 JSON 数组
- 2 <= JSON.stringify(arr).length <= 105
- 1 <= size <= arr.length + 1
解题思路
先计算出数组需要被分成多少块,然后创建一个长度为块数的空数组 res,并使用 Array.from() 方法将其转换为由空数组组成的新数组。接着,遍历原数组 arr 中的每个元素,并将其插入到 res 数组中对应的子数组中。具体来说,这里使用了 forEach() 方法和箭头函数,以及 Math.floor() 和 / 运算符来确定元素所属的块。
最后返回由子数组组成的新数组,即为按照指定大小分块后的结果。
例如,如果调用 chunk([1, 2, 3, 4, 5], 2),则返回一个新数组 [[1, 2], [3, 4], [5]],表示原数组 [1, 2, 3, 4, 5] 被分成了三个大小为2的子数组。
AC代码
/** * @param {Array} arr * @param {number} size * @return {Array} */ var chunk = function (arr, size) { const len = Math.ceil(arr.length / size); const res = Array.from({ length: len }, () => []); arr.forEach((item, index) => { res[Math.floor(index / size)].push(item); }); return res; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。