You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归遍历二维数组实现工厂员工轮班岗位交换的算法问题

实现思路
  • 第一步:预处理数据生成映射
    把输入的二维数组转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:12:03