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秋招各大笔试题汇总,c++,java,python多种语言分析,解答。