Jeff的隨手筆記

學習當一個前端工程師

0%

用LeetCode寫日記-Day21

昨天耍廢了一天,沒有看任何一點書,今天要認真補回來。

Day21: Chunk Array

問題描述:

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.

問題難度:Easy

問題限制:

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

我的解題過程:

題目的意思是把一個array 依照size的大小 來分割並儲存在新的array裡面,如果 arr.length 不能被 size 整除,則最後一個組的長度可能小於 size

所以我要解決的是如何讓array依照size的數值來分割。

分割的方法有slice()、splice()、split()

其中split() 是處理字串的,這次就不考慮。第一個想法就是使用**slice()**畢竟他是使用最多次的,而且不會修改掉原始資料。

我們使用的是for迴圈:

1
for (let i = 0; i < arr.length; i+= size) {code}

這邊考慮到size有機會不是1因此使用i+= size 來試試看。

code裡面就是要處理arr了

1
chunked.push(arr.slice(i, size))

咦,錯誤…只有第一組有資料…

啊我知道了,因為size是固定的,slice的第二個參數不是數量而是位置,假如size是3因此我這樣的寫法到第二次時就會變成slice(3,3)開始位置是3但結束位置也是3的狀況。

因此只要改成:

1
chunked.push(arr.slice(i, i + size))

就可以了。

我的code:

1
2
3
4
5
6
7
8
9
var chunk = function(arr, size) {
let chunked = []
for (let i = 0; i < arr.length; i+= size) {
chunked.push(arr.slice(i, i +size))
}

return chunked

};

其他解法:

1
2
3
4
const chunk = (arr, size) =>
Array.from({ length: Math.ceil(arr.length / size) }, (_, index) =>
arr.slice(index * size, index * size + size)
);
1
2
3
4
5
6
7
8
9
10
11
let chunk= (arr, size) =>{
const chunkedArray = [];
let index = 0;

while (index < arr.length) {
chunkedArray.push(arr.slice(index, index + size));
index += size;
}

return chunkedArray;
}

總結:

利用寫到這題的機會再次去翻了一下關於slice()、splice()、split()的內容,剛好有些忘記這個東西!