公司动态

华为OD机试真题 新系统 2026-07-12 PythonJS 实现【软件依赖树】

📅 2026/7/16 23:35:01
华为OD机试真题 新系统 2026-07-12 PythonJS 实现【软件依赖树】
目录题目思路Code题目题目内容在软件项目开发中不同版本组件之间会互相引用组件依赖组件形成一棵从根节点展开的依赖树。请对当前项目的组件依赖关系进行分析按项目组件依赖顺序输出最终有效的组件版本列表。输出顺序要求从根节点开始上层组件依赖先输出如果同层依赖则父组件先出现的优先输出父组件相同的按依赖出现顺序输出。依赖组件如果多次出现只保留第一次出现的顺序位置。同一组件如果有不同版本以首次依赖的组件版本作为输出。输入描述第一行是项目直属依赖 directDeps格式为 组件名:版本号:排除组件列表。第二行是全局组件依赖 depRules格式为 组件名:依赖组件名:依赖组件版本号:排除组件列表。输入列表顺序为依赖声明顺序。组件名和版本号由字母数字组成且非空。排除组件列表以英文逗号分隔可为空。输出描述输出符合依赖顺序要求的项目依赖组件列表格式为 组件名:版本号。多个组件之间用空格分隔。样例 1输入a:v1:输出a:v1说明项目仅依赖一个无传递依赖的组件。样例 2输入a:v1: b:v1:a:c:v1: b:d:v1: d:c:v2:输出a:v1 b:v1 c:v1 d:v1说明上层依赖先输出同层依赖按父组件出现顺序和依赖声明顺序输出。样例 3输入a:v1:ba:c:v1: a:b:v1: b:d:v1:输出a:v1 c:v1说明组件 a 指定排除 b因此 b 及其子依赖不出现。思路依赖顺序本质上是从项目直属依赖出发的层序遍历因此可以使用队列按层处理。每个队列元素携带当前路径上的排除集合展开子依赖时如果子组件被排除就跳过整棵子树。用集合记录已经输出过的组件名保证同一组件只保留第一次出现的位置和版本。Codeimport sys from collections import defaultdict, deque def exclusions(value): # 空排除列表表示当前路径不额外屏蔽任何组件。 return set(value.split(,)) if value else set() def parse_direct(token): parts token.split(:) return parts[0], parts[1], exclusions(parts[2] if len(parts) 2 else ) def parse_rule(token): parts token.split(:) return parts[0], parts[1], parts[2], exclusions(parts[3] if len(parts) 3 else ) def solve(direct_deps, dep_rules): rules defaultdict(list) for token in dep_rules: name, dep_name, version, blocked parse_rule(token) # 同一父组件的依赖按输入声明顺序保存。 rules[name].append((dep_name, version, blocked)) ans [] seen set() # 队列天然表达“上层依赖先输出、同层按入队顺序输出”的要求。 queue deque(parse_direct(token) for token in direct_deps) while queue: name, version, blocked queue.popleft() if name in seen: # 组件去重以首次出现为准后续版本或环路都不再输出。 continue seen.add(name) ans.append(f{name}:{version}) for dep_name, dep_version, dep_blocked in rules.get(name, []): # 当前路径排除的组件整棵子树都不能进入队列。 if dep_name in blocked: continue merged_blocked set(dep_blocked) merged_blocked.update(blocked) # 排除列表向下传递。 queue.append((dep_name, dep_version, merged_blocked)) return ans lines sys.stdin.read().splitlines() # 第一行和第二行分别解析保留每行内部的声明顺序。 direct lines[0].split() if len(lines) 0 and lines[0].strip() else [] rules lines[1].split() if len(lines) 1 and lines[1].strip() else [] print( .join(solve(direct, rules)))JSconst fs require(fs); function exclusions(value) { const ans new Set(); if (!value) return ans; // 空排除列表直接返回空集合非空时再按逗号拆分。 for (const name of value.split(,)) ans.add(name); return ans; } const lines fs.readFileSync(0, utf8).split(/\r?\n/); // 第一行是直属依赖第二行是全局依赖规则两者不能混在一起解析。 const directDeps lines[0] lines[0].trim() ? lines[0].trim().split(/\s/) : []; const depRules lines[1] lines[1].trim() ? lines[1].trim().split(/\s/) : []; const rules new Map(); for (const token of depRules) { const parts token.split(:); // 同一父组件下按输入顺序保留依赖。 if (!rules.has(parts[0])) rules.set(parts[0], []); rules.get(parts[0]).push({ name: parts[1], version: parts[2], blocked: exclusions(parts[3] || ) }); } const queue directDeps.map(token { const parts token.split(:); // 直属依赖先入队保证输出时根节点顺序与输入一致。 return {name: parts[0], version: parts[1], blocked: exclusions(parts[2] || )}; }); const seen new Set(); const ans []; while (queue.length) { const cur queue.shift(); // 首次出现决定版本再次遇到同名组件时只负责去重不覆盖答案。 if (seen.has(cur.name)) continue; seen.add(cur.name); ans.push(${cur.name}:${cur.version}); for (const dep of rules.get(cur.name) || []) { // 当前路径排除的组件整棵子树都跳过。 if (cur.blocked.has(dep.name)) continue; const merged new Set(dep.blocked); for (const item of cur.blocked) merged.add(item); // 排除列表向下传递。 queue.push({name: dep.name, version: dep.version, blocked: merged}); } } console.log(ans.join( ));【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。