请教一个数组的处理问题

发布于 2022-09-04 15:29:57 字数 251 浏览 16 评论 0

[
    [before=>4,after=>5],
    [before=>2,after=>3],
    [before=>1,after=>2],
    [before=>3,after=>4]
]

这样一个数组,表达的含义是4在5前面,2在3前面,1在2前面,3在4前面

根据这个数组,得到一个结果数组为[1,2,3,4,5]

请问应该怎么弄啊

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

把时间冻结 2022-09-11 15:29:57

不会写 PHP,给你写个 JavaScript 的参考

const preDefined = [
    { before: 4, after: 5 },
    { before: 2, after: 3 },
    { before: 1, after: 2 },
    { before: 3, after: 4 }
];

// 将对每一个 before 或 after 创建一个双向链表节点,
// 数据结构
// {
//     v: 值,
//     before: 前一节点,
//     after: 下一节点
// }
// 所有节点的集合就是 nodeList
nodeList = [];

// 根据值从 nodeList 中找到一个存在的节点
// 如果没有,就创建这个节点并加入到 nodeList
function findNode(v) {
    let node = nodeList.find(node => node.v === v);
    if (!node) {
        node = { v: v };
        nodeList.push(node);
    }
    return node;
}

// 对数据关系结点进行一个循环,连接它们的关系
preDefined.forEach(t => {
    // 找到或创建 before、after 节点
    let before = findNode(t.before);
    let after = findNode(t.after);

    // 把 before 和 after 连接起来
    before.after = after;
    after.before = before;
});

// 从 nodeList 中找出所有没有 before 中节点
// 这些节点就是头节点(这个样例数据中只有一个)
const heads = nodeList.filter(node => !node.before);

// 从每个头节点,按 after 引用往下找,
// 就找到了整个链条的数据,拼成数组
const all = heads.map(head => {
    const list = [];
    let current = head;
    while (current) {
        list.push(current.v);
        current = current.after;
    }
    return list;
});

// 把所有链条打印出来(本示例中只有一条)
all.forEach(list => console.log(list));

clipboard.png

莫言歌 2022-09-11 15:29:57

从一个这样数组生成一个有向图 比如 顶点={1 2 3 4 5} 边={4->5 2->3 1->2 3->4}

如果这图是有环图, 那么无解

如果是无环图就对顶点做拓扑排序, 可能有多于一组解

欢你一世 2022-09-11 15:29:57

这是什么语言啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文