跳至主要內容

2677. 分块数组


2677. 分块数组

🟢   🔗 力扣open in new window LeetCodeopen in new window

题目

Given an array arr and a chunk size size, return a chunked array.

A chunked array contains the original elements in arr, but consists of subarrays each of length size. The length of the last subarray may be less than size if arr.length is not evenly divisible by size.

You may assume the array is the output of JSON.parse. In other words, it is valid JSON.

Please solve it without using lodash's _.chunk function.

Example 1:

Input: arr = [1,2,3,4,5], size = 1

Output: [[1],[2],[3],[4],[5]]

Explanation: The arr has been split into subarrays each with 1 element.

Example 2:

Input: arr = [1,9,6,3,2], size = 3

Output: [[1,9,6],[3,2]]

Explanation: The arr has been split into subarrays with 3 elements. However, only two elements are left for the 2nd subarray.

Example 3:

Input: arr = [8,5,3,2,6], size = 6

Output: [[8,5,3,2,6]]

Explanation: Size is greater than arr.length thus all elements are in the first subarray.

Example 4:

Input: arr = [], size = 1

Output: []

Explanation: There are no elements to be chunked so an empty array is returned.

Constraints:

  • arr is a valid JSON array
  • 2 <= JSON.stringify(arr).length <= 10^5
  • 1 <= size <= arr.length + 1

题目大意

给定一个数组 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 <= 10^5
  • 1 <= size <= arr.length + 1

解题思路

  1. 遍历数组:使用 for 循环迭代数组 arr,每次递增 size
  2. 分割逻辑:每次取出 size 个元素,arr.slice(i, i + size),形成一个新的子数组,然后将其添加到结果数组中。
  3. 处理剩余元素:如果数组的长度不是 size 的倍数,最后的子数组可能会有少于 size 个元素。
  4. 返回结果:最终返回包含所有子数组的数组。

复杂度分析

  • 时间复杂度O(n),其中 n 是数组 arr 的长度,需要遍历整个数组一次。
  • 空间复杂度O(n),最坏情况下,结果数组的大小会与输入数组相同。

代码

/**
 * @param {Array} arr
 * @param {number} size
 * @return {Array}
 */
var chunk = function (arr, size) {
	let res = [];
	for (let i = 0; i < arr.length; i += size) {
		res.push(arr.slice(i, i + size));
	}
	return res;
};