日志文件异常检测

2026 华为OD机试真题 4月29日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

在某系统的日志监控服务中,需要实时检测日志文件中的异常模式。系统每天会产生大量日志记录,每条日志记录包含一个字符串标识。异常模式定义为:在同一时间段内,至少出现 33 次的日志标识。

请编写一个程序,找出所有出现次数大于等于 33 次的日志标识,并按照以下规则输出:

  1. 首先按照出现次数从高到低排序
  2. 如果出现次数相同,则按照首次出现的先后顺序排序

输入描述

  1. 日志标识由大小写字母、数字和下划线组成,长度不超过 5050
  2. 日志总量:[11,1000010000]

输出描述

  1. 输出所有出现次数大于等于 33 次的日志标识,每行一个,按照上述排序规则输出
  2. 如果没有符合条件的日志标识,则输出 "NONE"

示例1

输入

["error_404","error_404","warning_500","error_404","info_200","warning_500","warning_500","info_200"]

输出

["error_404","warning_500"]

说明

  1. error_404error_404 出现了 33 次(数组第00、11、33个元素),首次出现位置是第00个元素
  2. warning_500warning_500 出现了 33 次(数组第22、55、66个元素),首次出现位置是第22个元素
  3. info_200info_200 只出现了 22 次(数组第44、77个元素),不符合条件
  4. error_404error_404 和 warning_500warning_500 出现次数相同(都是33次),按照首次出现的先后顺序,先输出 error_404error_404,再输出 warning_500warning_500 注意:虽然 info_200info_200 出现了 22 次,但题目要求的是出现次数大于等于 33 次,因此不输出 info_200info_200

示例2

输入

["test_case","test_case","test_case2","test_case2","test_case2"]

输出

["test_case2"]

说明

  1. testcasetestcase 出现了 22 次,不符合条件
  2. testcase2testcase2 出现了 33 次,首次出现位置是数组第33个元素
  3. 只输出 testcase2testcase2 注意:testcasetestcase 虽然出现次数较多,但只有 22 次,不满足大于等于 33 次的条件

解题思路

核心思想

本题要求从一组日志标识中找出出现次数大于等于 3 次的标识,并按照特定规则排序。

  1. 统计频率与首次出现位置
    • 使用一个哈希表(Map)来记录每个日志标识出现的次数。
    • 使用另一个哈希表来记录每个日志标识在原始数组中首次出现的索引。
  2. 筛选异常标识
    • 遍历频率统计表,将出现次数 $\ge 3$ 的标识提取出来。
  3. 自定义排序
    • 规则 1:按出现次数从高到低排序(降序)。
    • 规则 2:若次数相同,按首次出现的先后顺序排序(索引升序)。
  4. 输出处理
    • 若没有符合条件的标识,输出 "NONE"。
    • 否则,按排序后的顺序输出标识。

复杂度分析

  • 时间复杂度:$O(N \log K)$ 或 $O(N + K \log K)$,其中 $N$ 是日志总数,$K$ 是满足条件的异常日志种类数。统计频率需要 $O(N)$,排序需要 $O(K \log K)$。
  • 空间复杂度:$O(N)$,需要哈希表存储所有日志标识的频率和首次出现位置。
THE END