递归遍历二维数组实现工厂员工轮班岗位交换的算法问题
实现思路
- 第一步:预处理数据生成映射
把输入的二维数组转换为oldToNew映射,键为旧岗位编号,值为对应的新岗位编号,方便后续O(1)效率查询岗位流转关系。同时筛选出所有旧岗位为99的条目作为序列的起始点。 - 第二步:遍历起始点生成流转序列
对每个起始点,以对应员工名为序列开头,从起始点的新岗位开始循环查询流转关系:每次把当前查询到的新岗位加入序列,再将该新岗位作为下一次查询的旧岗位,直到查询到的新岗位为99,或找不到对应旧岗位的流转关系(序列未闭合)时终止。
代码实现(JS)
function generateShiftSequence(input) { // 预处理生成旧岗位→新岗位的映射,同时收集序列起点 const oldToNew = new Map(); const startPoints = []; for (const [emp, [oldPos, newPos]] of input) { oldToNew.set(oldPos, newPos); if (oldPos === '99') { startPoints.push({ emp, startPos: newPos }); } } const result = []; for (const { emp, startPos } of startPoints) { // 起点新岗位直接为99的无有效流转序列,直接跳过 if (startPos === '99') continue; const sequence = [emp, startPos]; let currentPos = startPos; while (true) { const nextPos = oldToNew.get(currentPos); // 遇到终止符99或者找不到下一个流转关系就停止 if (!nextPos || nextPos === '99') break; sequence.push(nextPos); currentPos = nextPos; } // 可根据业务需求调整:比如过滤掉只有2个元素的无后续流转的序列 result.push(sequence); } return result; } // 测试示例 let example1 = [ ['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]], ]; console.log(generateShiftSequence(example1)) // 输出结果和预期完全一致:[["John","1","3","2"],["Alpha","4","5","6"]]
边界说明
- 按题目补充规则,新岗位除99外无重复,不会出现循环链路,while循环不会死循环
- 未闭合的序列会在找不到下一个流转关系时自动终止,可根据业务需求决定是否保留未闭合序列,或是过滤掉长度不符合要求的序列
内容的提问来源于stack exchange,提问作者Block West
相关产品推荐
相关产品推荐

