题目描述:
有 n
个人被分成数量未知的组。每个人都被标记为一个从 0
到 n - 1
的唯一ID 。
给定一个整数数组 groupSizes
,其中 groupSizes[i]
是第 i
个人所在的组的大小。例如,如果 groupSizes[1] = 3
,则第 1
个人必须位于大小为 3
的组中。
返回一个组列表,使每个人 i
都在一个大小为 groupSizes[i]
的组中。
每个人应该 恰好只 出现在 一个组 中,并且每个人必须在一个组中。如果有多个答案,返回其中 任何 一个。可以 保证 给定输入 至少有一个 有效的解。
源码及注释:
/**
* @param {number[]} groupSizes
* @return {number[][]}
*/
function groupThePeople(groupSizes) {
// 创建一个Hash Map,存储格式为[groupSize, [id]]
const group = new Map();
// 遍历groupSize进行存储
for(let i = 0; i < groupSizes.length; ++i) {
if(group.has(groupSizes[i])) {
let cur = group.get(groupSizes[i]);
cur.push(i);
group.set(groupSizes[i], cur);
} else {
group.set(groupSizes[i], [i]);
}
}
// 将Map转换为一个二维数组
const ansArr = [...group];
// 遍历进行分组
for(const item of ansArr) {
// 对id数组长度大于groupSize的元素进行分割,移到数组的末尾去
while(item[1].length > item[0]) {
ansArr.push([item[0], item[1].splice(item[0], 2 * item[0])]);
}
}
// 再对这个二维数组进行映射,只保留每个元素的第二项
return ansArr.map((item) => {return item = item[1];});
};