今天面试居然碰到了这个问题,百度了一下搜不到啊 只能自己手撸了。。
/** * 部门安排所有组合 * @param departments: dict, key是部门名, value是每个部门对应所有员工ID数组 * 例 {'frontend': [1, 2], 'backend': [3, 4], 'devops': [5]} * @param required_department: dict, 该任务需要参与的部门和需要的人数 * 例 {'frontend': 2, 'backend': 1} * @return 所有可能的员工组合, 例 [[1, 2, 3], [1, 2, 4]]. 按员工ID升序排序 */
const test=(department_staff_dict,required_staff)=>{ const getGroup = (data, index = 0, group = []) => { let need_apply = new Array(); need_apply.push(data[index]); for (let i = 0; i < group.length; i++) { need_apply.push(group[i] + data[index]); } group.push.apply(group, need_apply); if (index + 1 >= data.length) return group; else return getGroup(data, index + 1, group); } const arrayDiff = (array, count) => { return getGroup(array.map(m => m + '')).filter(s => s.length === count); } let obArr = [] let index = 0; for (let required in required_staff) { index += required_staff[required]; obArr = obArr.concat(arrayDiff(department_staff_dict[required], required_staff[required])) } return arrayDiff(obArr, index).map(m => m.split('').map(r => parseInt(r)).sort((a,b)=>a-b)); } console.log(test({'frontend': [1, 2], 'backend': [3, 4], 'devops': [5]},{'frontend': 2, 'backend': 1}))