陣列切割 (Chunk)#

陣列切割是面試常見的陣列試題,可以先自己試試再看解答~

題目:

寫一個方法(函式) ,給這個方法一個陣列與數字n,n 為要切割子陣列的大小,回傳切割好的陣列與子陣列。

中文很難懂,看看輸入跟輸出的例子吧!

Example:

input1
function chunk([1,2,3,4,5], 2)
output1
[[1,2],[3,4], 5]
-----------------------
input2
function chunk([1,2,3,4,5,6,7,8,9], 3)
output2([[1,2,3],[4,5,6],[7,8,9]])
warning

請先自己想一下再看解答

主要想法#

提示

先設定一個新陣列 (mainAry),然後回圈檢查裡面的子陣列 (subAry) 是否為空或是已經達到需要的長度, 如果是空的就在新陣列裡新增 subAry, 如果不是空的就補上目前 subAry 裡面的 element。

JavaScript 解法#

以下用 JavaScript 實作上面的想法

function chunk(qArray, size) {
const mainAry = []
for(let el of qArray){
const subAry = mainAry[mainAry.length -1]
if(!subAry || subAry.length === size){
mainAry.push([el])
} else {
subAry.push(el)
}
}
console.log(mainAry)
return mainAry;
}

JavaScript 解法 2#

Array.prototype.slice() 方法挑出子陣列 (subAry),再放到主陣列(mainAry)

function chunk2(array, size) {
const mainAry = [];
let index = 0;
while (index < array.length) {
let subAry = array.slice(index, index + size)
mainAry.push(subAry);
index = index + size;
}
return mainAry;
}

Java 解法#

public class Solution {
private <T> List<List<T>> chunk(List<T> members, int maxSize) {
List<List<T>> mainAry = new ArrayList<>();
List<T> subAry = new ArrayList<>();
for (T member : members) {
subAry.add(member);
if (subAry.size() == maxSize) {
mainAry.add(subAry);
subAry = new ArrayList<>();
}
}
if (!subAry.isEmpty()) {
mainAry.add(subAry);
}
return mainAry;
}
public static void main(String[] args) {
Solution sol = new Solution();
List list = new LinkedList();
list.add(1);
list.add("sun");
list.add(3);
list.add("apple");
System.out.println(sol.chunk(list, 2));
}
}

此文同時發佈於 2020 鐵人賽。