2023 用友笔试 0918

笔试时间:2023年9月18日 秋招

第一题

题目

假设有一种可以在人与人之间进行快速传播的新型病毒 (记为V),如果有人(记为A)感染了这种病毒,并在某个时刻t和另一个人 B 接触,那么B 也会立刻感染病毒 V。现有如下条件:

1、给定一个正整数n,代表n 个人,这些人的编号从0到n-1;

2、给定一个下标从0开始的二维数组 meetings,其中 meetings[i]=[xi,yi,ti] 表示人员xi和yi在时刻ti有过接触;在 meetings 代表的所有接触发生期间,感染者会一直处于感染状态;

3、同一个人A可以在某一时刻同时和多个人接触,且如果A感染了病毒V,那么和A接触的所有人都会立刻感染该病毒;即:假设人员xi和yi在时刻ti有过接触,如果 xi 感染了病毒 V,那么yi 也会感染该病毒,反之亦然;

4、病毒V的感染是瞬间发生的,也就是说,如果人员A在时刻t 感染了病毒,那么A马上就可以把病毒V 传染给接触到的其他人;

5、给定一个整数 firstPerson,代表某个人,且 0 < firstPerson< n;

6、人员 0 感染了病毒V,并在时刻 0与 firstPerson 有过接触。

在meetings代表的所有接触都发生之后,请返回感染病毒V的所有感染者的编号列表,并按照从小到大的顺序记录人员编号。

样例输入

6,[[1 2,5][2 3 8],[1 5 101],1

样例输出

[0,1,2,3,5]

说明

时刻0,人员0与人员1接触,人员1 感染病毒

时刻5,人员1与人员2 接触,人员2 感染病毒

时刻8,人员2与人员3 接触,人员3 感染病毒,

时刻 10,人员1与人员 5接触,人员5感染病毒。

因此,在所有接触发生后,人员0、1、2、3、5都是感染者。

参考题解

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

class Spread {
public:
    int p1;
    int p2;
    int time;

    Spread(int p1, int p2, int time) : p1(p1), p2(p2), time(time) {}

    int getP1() const {
        return p1;
    }

    int getP2() const {
        return p2;
    }

    int getTime() const {
        return time;
    }
};

std::vector<int> findAllPerson(int n, std::vector<std::vector<int>>& meetings, int firstPerson) {
    std::vector<Spread> list;
    std::set<int> set;
    int len = meetings.size();

    // 添加传播事件到列表
    for (int i = 0; i < len; i++) {
        int p1 = meetings[i][0];
        int p2 = meetings[i][1];
        int time = meetings[i][2];
        list.push_back(Spread(p1, p2, time));
    }

    // 第0号人进行传播给firstPerson
    set.insert(0);
    set.insert(firstPerson);

    // 按时间进行排序
    std::sort(list.begin(), list.end(), [](const Spread& o1, const Spread& o2) {
        return o1.getTime() < o2.getTime();
    });

    // 判断传播途径
    for (const Spread& spread : list) {
        if (set.count(spread.getP1()) || set.count(spread.getP2())) {
            // 都被感染
            set.insert(spread.getP1());
            set.insert(spread.getP2());
        }
    }

    // 转为vector并排序
    std::vector<int> ans(set.begin(), set.end());
    std::sort(ans.begin(), ans.end());

    return ans;
}

// test-提交时不需要
int main() {
    int n = 6;
    std::vector<std::vector<int>> meetings = {{1, 2, 5}, {2, 3, 8}, {1, 5, 101}};
    int firstPerson = 1;
    std::vector<int> result = findAllPerson(n, meetings, firstPerson);

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

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

class SpreadSimulator {
    public ArrayList<Integer> findAllPerson(int n, int[][] meetings, int firstPerson) {
        List<Spread> list = new ArrayList<>();
        Set<Integer> set = new HashSet<>(); //进行去重
        int len = meetings.length; //有几条Spread

        // 添加传播事件到列表
        for (int i = 0; i < len; i++) {
            int p1 = meetings[i][0];
            int p2 = meetings[i][1];
            int time = meetings[i][2];
            list.add(new Spread(p1, p2, time));
        }

        // 第0号人进行传播给firstPerson
        set.add(0);
        set.add(firstPerson);

        // 按时间进行排序
        Collections.sort(list, new Comparator<Spread>() {
            @Override
            public int compare(Spread o1, Spread o2) {
                return o1.getTime() - o2.getTime();
            }
        });

        // 判断传播途径
        for (Spread spread : list) {
            if (set.contains(spread.getP1()) || set.contains(spread.getP2())) {
                // 都被感染
                set.add(spread.getP1());
                set.add(spread.getP2());
            }
        }

        // 转为list
        ArrayList<Integer> ans = new ArrayList<>(set);

        // 排序
        Collections.sort(ans);

        return ans;
    }

/

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
杨柳哥:这不是普通人,那这个钱的是天才
点赞 评论 收藏
分享
2 4 评论
分享
牛客网
牛客企业服务