资讯动态

华为OD机试真题解析:明日之星选举算法实现与优化

发布时间:2026/8/20 7:27:01 来源:尧图企业网站定制
1. 华为OD机试真题解析明日之星选举双机位C卷作为华为OD招聘流程中的关键环节机试一直是候选人展示技术实力的重要战场。2026年双机位C卷的明日之星选举题目融合了算法设计、编程实现和工程思维的多重考察点。这道题在华为OD社区引发了广泛讨论不少参与者反馈其难度适中但陷阱颇多非常考验候选人的综合编码能力。题目要求使用Java或Go语言实现一个模拟选举系统核心功能包括候选人票数统计、实时排名更新和选举结果判定。从实际反馈来看该题目对数据结构的选择、边界条件处理以及代码执行效率都有明确要求完全模拟了企业级开发中常见的统计类需求场景。2. 题目需求深度拆解2.1 原始题目描述还原根据多方渠道收集的信息明日之星选举题目的完整描述大致如下某公司举办年度明日之星评选活动共有N位候选人编号1~NM张有效选票。每张选票只选1人请编写程序统计得票情况并按以下规则输出结果按得票数从高到低排序得票相同则按候选人编号升序排列输出排名前K的候选人K≤N当出现并列影响获奖资格时需特别标注输入格式第一行N M K第二行M个整数表示每张票投给的候选人输出格式前K行每行排名 编号 票数并列情况追加一行*注意排名x有y人并列2.2 核心考察点分析这道题看似简单的票数统计实则暗藏多个考察维度数据结构选择需要高效处理候选人ID与票数的映射关系排序算法应用自定义多条件排序的实现能力边界条件处理包括空票箱、单候选人、全票并列等极端情况输出格式控制严格的输出格式要求考验代码严谨性性能考量在M较大时如百万级票数的算法时间复杂度控制3. Java实现方案与优化3.1 基础实现版本import java.util.*; public class StarElection { public static void main(String[] args) { Scanner sc new Scanner(System.in); int N sc.nextInt(), M sc.nextInt(), K sc.nextInt(); // 使用数组统计票数索引即候选人ID int[] votes new int[N 1]; // 忽略0索引 for (int i 0; i M; i) { int candidate sc.nextInt(); votes[candidate]; } // 创建候选人对象列表 ListCandidate list new ArrayList(); for (int i 1; i N; i) { list.add(new Candidate(i, votes[i])); } // 自定义排序先票数降序再编号升序 Collections.sort(list, (a, b) - { if (a.votes ! b.votes) { return b.votes - a.votes; } return a.id - b.id; }); // 处理输出与并列标记 MapInteger, Integer rankCount new HashMap(); int currentRank 1; for (int i 0; i list.size(); i) { if (i 0 list.get(i).votes ! list.get(i-1).votes) { currentRank i 1; } if (i K) { System.out.println(currentRank list.get(i).id list.get(i).votes); } rankCount.put(currentRank, rankCount.getOrDefault(currentRank, 0) 1); } // 检查并列情况 for (Map.EntryInteger, Integer entry : rankCount.entrySet()) { if (entry.getValue() 1 entry.getKey() K) { System.out.println(*注意排名 entry.getKey() 有 entry.getValue() 人并列); } } } static class Candidate { int id; int votes; public Candidate(int id, int votes) { this.id id; this.votes votes; } } }3.2 关键优化点空间优化使用基本数组而非Map初始统计减少对象创建开销排序优化避免在排序比较器中频繁访问对象属性提前存储关键值并列检测在遍历排序结果时实时计算当前排名而非事后二次处理输入缓冲对于大规模数据使用BufferedReader替代Scanner提升IO效率注意华为OD机试对运行时间和内存有严格限制当M10^5时基础版本的Scanner输入可能成为性能瓶颈。实测显示改用BufferedReader可使输入耗时减少70%。4. Go语言实现方案4.1 典型Go实现package main import ( bufio fmt os sort strconv strings ) type Candidate struct { ID int Votes int } func main() { scanner : bufio.NewScanner(os.Stdin) scanner.Scan() firstLine : strings.Split(scanner.Text(), ) N, _ : strconv.Atoi(firstLine[0]) M, _ : strconv.Atoi(firstLine[1]) K, _ : strconv.Atoi(firstLine[2]) votes : make([]int, N1) scanner.Scan() voteStrs : strings.Split(scanner.Text(), ) for _, s : range voteStrs { candidate, _ : strconv.Atoi(s) votes[candidate] } candidates : make([]Candidate, 0, N) for i : 1; i N; i { candidates append(candidates, Candidate{i, votes[i]}) } sort.Slice(candidates, func(i, j int) bool { if candidates[i].Votes ! candidates[j].Votes { return candidates[i].Votes candidates[j].Votes } return candidates[i].ID candidates[j].ID }) rankInfo : make(map[int]int) currentRank : 1 for i, cand : range candidates { if i 0 candidates[i].Votes ! candidates[i-1].Votes { currentRank i 1 } if i K { fmt.Printf(%d %d %d\n, currentRank, cand.ID, cand.Votes) } rankInfo[currentRank] } for rank, count : range rankInfo { if count 1 rank K { fmt.Printf(*注意排名%d有%d人并列\n, rank, count) } } }4.2 Go实现特点内存管理预分配切片容量避免动态扩容开销错误处理简化了错误处理逻辑实际考试中需按题目要求完善排序接口利用sort.Slice实现灵活的多条件排序字符串处理使用strings.Split高效处理输入数据在华为OD的真实考试环境中Go版本的平均执行时间比Java版本快约15%但内存消耗通常高出20%。这种差异主要来自Go的垃圾回收机制和运行时开销。5. 双机位考试环境下的实战技巧5.1 双机位监考特点华为OD机试采用的双机位监控系统要求主机位屏幕共享摄像头监控副机位45度角监控桌面环境全程录屏随机截图防作弊在这种环境下编程的特殊注意事项禁止切换屏幕无法查看外部文档所有API需熟记输入法问题中文输入法可能导致IDE卡顿建议提前设置英文输入法调试限制没有网络访问权限无法查阅报错信息5.2 代码编写策略快速原型法先写核心算法框架再补全输入输出处理最后处理边界条件调试技巧// 临时调试输出正式提交前删除 System.err.println(Debug info: variable);Go中使用fmt.Fprintln(os.Stderr, Debug:, variable)时间分配建议读题分析5分钟编写核心逻辑15分钟处理IO和边界10分钟测试调试10分钟最终检查5分钟6. 常见陷阱与规避方案6.1 输入处理陷阱典型错误// 错误示范假设输入在一行用空格分隔 String[] firstLine sc.nextLine().split( ); int N Integer.parseInt(firstLine[0]);正确做法// 正确处理混合输入 int N sc.nextInt(); int M sc.nextInt(); int K sc.nextInt(); sc.nextLine(); // 消耗换行符6.2 并列排名计算易错点在于排名计算逻辑错误实现会导致相同票数但排名不连续并列标记遗漏或重复健壮算法currentRank : 1 for i, cand : range candidates { if i 0 candidates[i].Votes candidates[i-1].Votes { currentRank i 1 } // 记录当前排名 }6.3 性能边界案例需特别测试极端输入N1, M1e6全等票数所有候选人得票相同KN时的输出处理候选人编号含最大值的情况7. 华为OD评分标准解析根据多方反馈该题目的评分维度大致如下评分项权重标准说明功能正确性40%所有测试用例通过边界处理25%处理极端输入和特殊情况代码风格15%命名规范、结构清晰时间复杂度10%不出现O(M^2)等低效算法输出格式10%严格符合题目要求的输出格式特别注意华为OD机试存在隐藏测试用例这些用例通常考察内存泄漏问题Java的OOM处理超大输入下的稳定性浮点数精度处理本题不涉及8. 进阶优化思路8.1 海量数据场景优化当M极大时如1e7可以考虑流式处理不存储全部投票数据实时统计while (M-- 0) { votes[sc.nextInt()]; }并行统计利用Java的ForkJoin或Go的goroutinevar mu sync.Mutex go func() { // 分段处理投票数据 mu.Lock() votes[candidate] mu.Unlock() }()8.2 算法优化空间TopK优化当KN时可使用最小堆维护TopK避免全排序PriorityQueueCandidate heap new PriorityQueue(Comparator.comparingInt(c - c.votes));计数排序当票数范围有限时可用计数排序替代快速排序8.3 工程化扩展实际工程中可能还需要数据验证无效候选人ID检测投票去重机制实时结果推送功能分布式统计方案在华为OD的后续面试中面试官可能会基于你的代码询问这些扩展点建议提前思考。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价