当前位置: 首页 > news >正文

华为OD机试 - 统计员工影响力分数(Python/JS/C/C++ 新系统 200分)

华为OD机试 新系统 统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)。

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

假设你是大型科技公司的数据分析师,负责分析公司内部员工的社交网络。你需要编写一个函数来计算每个员工的影响力分数。影响力分数定义为该员工直接和间接影响的员工数量。

二、输入描述

n:员工总数。

employess:一个二维列表,表示员工的社交网络关系。例如employees[i]是一个包含员工 i 直接影响的员工ID的列表。

备注

employees列表中,* 表示没有直接影响到的员工;员工总数小于20;自身不算分数。

三、输出描述

influenceScores,一个整数数组,表示每个员工的影响力分数。

四、测试用例

测试用例1:

1、输入

4
1
2
3
*

2、输出

3 2 1 0

3、说明

0 -> 1 -> 2 -> 3,所以 0 能影响 1、2、3,共 3 人

1 能影响 2、3,共 2 人

2 能影响 3,共 1 人

3 不能影响任何人,得 0

测试用例2:

1、输入

5
1 2
3
4
*
*

2、输出

4 1 1 0 0

3、说明

0 直接影响 1、2,间接还能影响 3、4,共 4 人

1 影响 3,共 1 人

2 影响 4,共 1 人

3、4 均无影响

五、解题思路

这道题本质上是一个有向图的可达性统计问题。

1、建模

把每个员工看成图中的一个节点。

如果员工 i 直接影响员工 j,就建立一条从 i -> j 的有向边。

这样,题目就转化为:对图中的每个节点,求从它出发可以到达多少个其他节点。

2、求解方式

对每个员工 i,执行一次 DFS(或 BFS):

  • 能直接到达的员工计入影响力
  • 能通过别人继续到达的员工,也计入影响力
  • 使用 visited 数组避免重复访问,防止环导致死循环

最后统计 visited 中为 true 的个数即可。

六、Python算法源码

importsys# 深度优先搜索:从当前员工出发,找到所有可影响到的员工defdfs(node,graph,visited):fornxtingraph[node]:ifnotvisited[nxt]:visited[nxt]=Truedfs(nxt,graph,visited)defmain():lines=sys.stdin.read().splitlines()ifnotlines:return# 读取员工总数n=int(lines[0].strip())# 邻接表:graph[i] 表示员工 i 直接影响到的员工graph=[[]for_inrange(n)]# 读取每个员工的直接影响关系foriinrange(n):line=lines[i+1].strip()ifi+1<len(lines)else""# "*" 或空行表示没有直接影响对象ifnotlineorline=="*":continueforsinline.split():v=int(s)# 做边界保护,并排除自己影响自己if0<=v<nandv!=i:graph[i].append(v)ans=[]# 对每个员工分别进行 DFSforiinrange(n):visited=[False]*n dfs(i,graph,visited)# True 的个数就是影响力分数ans.append(str(sum(visited)))# 按题意输出sys.stdout.write(" ".join(ans))if__name__=="__main__":main()

七、JavaScript算法源码

constfs=require("fs");constinput=fs.readFileSync(0,"utf8").split(/\r?\n/);if(input.length>0&&input[0].trim()!==""){// 员工总数constn=Number(input[0].trim());// 邻接表:graph[i] 表示员工 i 直接影响到的员工constgraph=Array.from({length:n},()=>[]);// 构建图for(leti=0;i<n;i++){constline=(input[i+1]||"").trim();// "*" 或空行表示没有直接影响任何人if(!line||line==="*"){continue;}constarr=line.split(/\s+/);for(constsofarr){constv=Number(s);// 边界保护,并排除自己影响自己if(v>=0&&v<n&&v!==i){graph[i].push(v);}}}// 深度优先搜索functiondfs(node,visited){for(constnxtofgraph[node]){if(!visited[nxt]){visited[nxt]=true;dfs(nxt,visited);}}}constans=[];// 对每个员工计算影响力for(leti=0;i<n;i++){constvisited=Array(n).fill(false);dfs(i,visited);// 统计能影响到的人数constcount=visited.filter(Boolean).length;ans.push(String(count));}// 按题意输出process.stdout.write(ans.join(" "));}

八、C算法源码

#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMAXN25#defineMAXLINE512// graph[i][k] 表示员工 i 直接影响到的第 k 个员工intgraph[MAXN][MAXN];// sizes[i] 表示员工 i 的直接影响人数intsizes[MAXN];// 员工总数intn;/** * 深度优先搜索 * 功能:从 node 出发,标记所有可影响到的员工 */voiddfs(intnode,intvisited[]){for(inti=0;i<sizes[node];i++){intnxt=graph[node][i];if(!visited[nxt]){visited[nxt]=1;dfs(nxt,visited);}}}intmain(){// 读取员工总数if(scanf("%d",&n)!=1){return0;}// 吃掉换行符,方便后续 fgets 读整行getchar();charline[MAXLINE];// 构图for(inti=0;i<n;i++){sizes[i]=0;if(!fgets(line,sizeof(line),stdin)){line[0]='\0';}// 去掉行末换行符line[strcspn(line,"\r\n")]='\0';// "*" 或空行表示没有直接影响任何人if(strlen(line)==0||strcmp(line,"*")==0){continue;}// 按空格拆分char*token=strtok(line," ");while(token!=NULL){intv=atoi(token);// 边界保护,并排除自己影响自己if(v>=0&&v<n&&v!=i){graph[i][sizes[i]++]=v;}token=strtok(NULL," ");}}// 对每个员工做一次 DFSfor(inti=0;i<n;i++){intvisited[MAXN]={0};dfs(i,visited);intcount=0;for(intj=0;j<n;j++){count+=visited[j];}if(i>0){printf(" ");}printf("%d",count);}return0;}

九、C++算法源码

#include<bits/stdc++.h>usingnamespacestd;/** * 深度优先搜索 * 从当前员工 node 出发,找到所有可影响到的员工 */voiddfs(intnode,constvector<vector<int>>&graph,vector<int>&visited){for(intnxt:graph[node]){if(!visited[nxt]){visited[nxt]=1;dfs(nxt,graph,visited);}}}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);string firstLine;if(!getline(cin,firstLine)||firstLine.empty()){return0;}// 员工总数intn=stoi(firstLine);// 邻接表vector<vector<int>>graph(n);// 读取每个员工的直接影响关系for(inti=0;i<n;i++){string line;if(!getline(cin,line)){line="";}// "*" 或空行表示没有直接影响任何人if(line.empty()||line=="*"){continue;}stringstreamss(line);intv;// 解析该行所有员工编号while(ss>>v){// 边界保护,并排除自己影响自己if(v>=0&&v<n&&v!=i){graph[i].push_back(v);}}}// 计算每个员工的影响力分数for(inti=0;i<n;i++){vector<int>visited(n,0);dfs(i,graph,visited);intcount=accumulate(visited.begin(),visited.end(),0);if(i>0){cout<<" ";}cout<<count;}return0;}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 新系统 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

http://www.jsqmd.com/news/642918/

相关文章:

  • Photon Bridge 与 PHIX 合作开发 AI 数据中心激光光源
  • 终极性能提升秘籍:tiny-cuda-nn的JIT融合技术深度剖析
  • 终极指南:如何使用gumbo-parser构建高效HTML5解析工具
  • FastAdmin省市区联动选择:三种实现方案与实战解析
  • NestJs CRUD Swagger文档自动生成:终极API文档化指南
  • 告别PDF乱码!MinerU镜像一键转换多栏文档为Markdown
  • Java 云原生开发实践指南:构建现代化云应用
  • AI Agent入门指南:轻松掌握智能体核心技术,收藏学习必备!
  • 如何用wangEditor 5和mammoth.js实现Word文档一键转HTML(附完整代码)
  • TwitterOAuth完整指南:如何快速上手最流行的PHP Twitter API库
  • 别再凭感觉画线了!用SI9000搞定PCB阻抗计算(附嘉立创四层板实战参数)
  • 电工接线仿真软件 下载即用无需联网 支持本地自定义操作
  • TF-IDF算法避坑指南:为什么你的文本分类效果不如预期?
  • API调用式超大报告生成全链路优化方案
  • 终极gumbo-parser依赖冲突解决指南:版本选择策略与兼容性处理
  • Pfff插件开发指南:扩展你的代码分析能力
  • 7个实用技巧:用Cucumber Ruby构建高效测试框架的完整指南
  • Go-SCP正则表达式安全:如何避免ReDoS攻击的终极指南
  • 终极指南:如何高效维护和更新awesome-gcp-certifications资源库
  • 终极指南:如何使用Siren实现iOS应用自动版本检查与更新提示
  • Simulink建模避坑指南:ADRC跟踪微分器TD参数(r, h)怎么调?一个案例讲清楚
  • 【泛微】动态联动控制:主表字段变化触发明细行智能增删与内容同步
  • 小白/程序员必看:收藏这篇,轻松入门大模型智能体框架开发实战!
  • leetcode 1658. 将 x 减到 0 的最小操作数-Minimum Operations to Reduce X to Zero
  • 多模态对话系统2026生存清单:7项必测指标、5类隐性失效模式、3套即插即用评估工具(附大会官方Benchmark数据集)
  • 如何使用TinyColor实现JavaScript中的终极颜色操作:从基础到高级技巧
  • 7个终极Rivet性能优化技巧:提升AI代理执行效率的实用方法
  • 奇瑞加速欧洲布局,扩产计划开启新征程
  • craftzdog-homepage设计理念:从概念到实现的完整思考过程
  • ACPI调试