iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Software Development

One Punch 一拳搞定前後端面試系列 第 6

[One Punch 一拳搞定前後端面試] DAY-06 - 陣列切割

陣列切割 (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]])

請先自己想一下再看解答

主要想法

提示:

先設定一個新陣列 (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));
	}

}

此文同時發佈於好讀版


上一篇
[One Punch 一拳搞定前後端面試] DAY-05 - FizzBuzz
下一篇
[One Punch 一拳搞定前後端面試] DAY-07 - 第一字母大寫
系列文
One Punch 一拳搞定前後端面試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言