首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2026-01-31:重排完成顺序。用go语言,给定两个数组:order 长度为 n,包含 1 到 n 的所有编号且互不重复,数组中元素的先后位置表示选手

2026-01-31:重排完成顺序。用go语言,给定两个数组:order 长度为 n,包含 1 到 n 的所有编号且互不重复,数组中元素的先后位置表示选手

作者头像
福大大架构师每日一题
发布2026-02-09 14:43:31
发布2026-02-09 14:43:31
610
举报

2026-01-31:重排完成顺序。用go语言,给定两个数组:order 长度为 n,包含 1 到 n 的所有编号且互不重复,数组中元素的先后位置表示选手完成比赛的先后次序;friends 是一个按升序列出的朋友编号集合,且每个编号都出现在 order 中。请输出一个新的数组,把 friends 中的编号按它们在 order 中出现的先后顺序重新排列并返回。

1 <= n == order.length <= 100。

order 包含从 1 到 n 的每个整数,且恰好出现一次。

1 <= friends.length <= min(8, n)。

1 <= friends[i] <= n。

friends 是严格递增的。

输入:order = [3,1,2,5,4], friends = [1,3,4]。

输出:[3,1,4]。

解释:

完成顺序是 [3, 1, 2, 5, 4]。因此,你朋友的完成顺序是 [3, 1, 4]。

题目来自力扣3668。

📌 步骤一:初始化与标记准备

首先,代码会创建一个名为 isFriend 的布尔型切片(slice),其长度为 n+1norder 数组的长度)。这个切片的作用就像一个"标记位图",索引代表选手的编号。接着,代码会遍历输入的 friends 数组,对于其中的每一个朋友编号,在 isFriend 切片的对应索引位置标记为 true。这相当于快速登记了哪些编号是我们的朋友。

📌 步骤二:按完成顺序筛选朋友

然后,代码开始按照比赛的真实完成顺序(即 order 数组的顺序)来筛选朋友。它会依次检查 order 数组中的每一个编号。对于每个编号,它去查询 isFriend 标记数组。如果发现当前编号被标记为 true(说明这个选手是朋友),就将这个编号添加到一个新的结果数组 ans 中。这个结果数组在创建时已经根据朋友的数量预分配了内存,这有助于提升后续添加操作的效率。

📌 步骤三:返回结果

order 数组被完全遍历后,结果数组 ans 中就包含了所有朋友编号,并且它们的顺序严格遵循了在 order 中出现的先后次序。最后,将这个结果数组返回。

💡 复杂度分析

  • 总的时间复杂度O(n)。 这是因为代码主要执行了两个简单的线性循环:第一个循环遍历 friends 数组(长度最大为8)来建立标记,其时间复杂度为 O(m),其中 m 是朋友数量。第二个循环遍历 order 数组(长度为 n)来筛选朋友,其时间复杂度为 O(n)。由于题目中朋友数量 m 远小于 n(m ≤ 8),所以总的时间复杂度由代价更高的 O(n) 循环主导,记为 O(n)。
  • 总的额外空间复杂度O(n)。 这主要是由创建的 isFriend 标记数组导致的,该数组的长度为 n+1,因此需要 O(n) 的额外空间。结果数组 ans 存储朋友编号,其长度最大为8,属于常数空间开销 O(1)。所以,整体的额外空间复杂度是 O(n)。

Go完整代码如下:

.

代码语言:javascript
复制
package main

import (
    "fmt"
)

func recoverOrder(order, friends []int) []int {
    n := len(order)
    isFriend := make([]bool, n+1)
    for _, x := range friends {
        isFriend[x] = true
    }

    ans := make([]int, 0, len(friends)) // 预分配空间
    for _, x := range order {
        if isFriend[x] {
            ans = append(ans, x)
        }
    }
    return ans
}

func main() {
    order := []int{3, 1, 2, 5, 4}
    friends := []int{1, 3, 4}
    result := recoverOrder(order, friends)
    fmt.Println(result)
}
在这里插入图片描述
在这里插入图片描述

Python完整代码如下:

.

代码语言:javascript
复制
# -*-coding:utf-8-*-

from typing import List

def recover_order(order: List[int], friends: List[int]) -> List[int]:
    friend_set = set(friends)
    return [x for x in order if x in friend_set]

def main():
    order = [3, 1, 2, 5, 4]
    friends = [1, 3, 4]
    result = recover_order(order, friends)
    print(result) 

if __name__ == "__main__":
    main()
在这里插入图片描述
在这里插入图片描述

C++完整代码如下:

.

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

vector<int> recoverOrder(const vector<int>& order, const vector<int>& friends) {
    // 使用哈希集合的方法(更高效)
    unordered_set<int> friendSet(friends.begin(), friends.end());

    vector<int> ans;
    ans.reserve(friends.size()); // 预分配空间

    for (int x : order) {
        if (friendSet.find(x) != friendSet.end()) {
            ans.push_back(x);
        }
    }

    return ans;
}

// 如果要用类似Go版本的布尔数组方法(要求数值范围不大)
vector<int> recoverOrderBoolArray(const vector<int>& order, const vector<int>& friends) {
    // 找到最大值来确定数组大小
    int maxVal = 0;
    for (int x : order) {
        if (x > maxVal) maxVal = x;
    }
    for (int x : friends) {
        if (x > maxVal) maxVal = x;
    }

    vector<bool> isFriend(maxVal + 1, false);
    for (int x : friends) {
        if (x <= maxVal) {
            isFriend[x] = true;
        }
    }

    vector<int> ans;
    ans.reserve(friends.size());

    for (int x : order) {
        if (x <= maxVal && isFriend[x]) {
            ans.push_back(x);
        }
    }

    return ans;
}

int main() {
    vector<int> order = {3, 1, 2, 5, 4};
    vector<int> friends = {1, 3, 4};

    vector<int> result = recoverOrder(order, friends);

    for (int x : result) {
        cout << x << " ";
    }
    cout << endl;

    return0;
}
在这里插入图片描述
在这里插入图片描述

·


我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📌 步骤一:初始化与标记准备
  • 📌 步骤二:按完成顺序筛选朋友
  • 📌 步骤三:返回结果
  • 💡 复杂度分析
  • Go完整代码如下:
  • Python完整代码如下:
  • C++完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档