Intel 面试真题:Parse Log File,统计 Error 数量并按时间分组

这次分享一道 Intel 面试中出现过的 log parsing 题目,原题很短:

Parse log file count number of error and group by time

中文理解就是:给一份日志文件,统计里面有多少条 ERROR,并且按照时间进行分组。

这类题看起来像简单字符串处理,但真实面试里最容易出问题的地方不是代码,而是题目太模糊。面试官没有明确说日志格式,也没有说按 year、month、day 还是 hour 分组。如果候选人一上来就写代码,很容易写死 sample,后面被追问时就会比较被动。


面试中应该先确认什么?

我们当时辅助候选人的第一步,是先让他把需求说清楚:

I will assume each log line starts with a timestamp, followed by log level like INFO or ERROR. I will count the lines whose level is ERROR, and group them by a time bucket such as year, month, day, or hour.

这里有几个关键点:

首先,不要简单判断一行里是否包含 "ERROR"。因为有些日志的 message 里也可能出现 ERROR 这个词,但真正判断日志级别时,应该看 log level 字段。

例如:

2023-01-10 10:15:32 ERROR Disk failure at node 3
2023-01-10 10:16:20 INFO Previous ERROR has been resolved

第二行虽然包含 ERROR,但它的 level 是 INFO,所以不应该算作错误日志。


基本解题思路

整体思路可以分成三步:

  1. 逐行读取 log file,避免一次性把大文件全部加载到内存。
  2. 对每一行解析 timestamp 和 log level。
  3. 如果 level 是 ERROR,就根据指定的时间粒度更新计数。

核心代码可以写得很简单:

def count_errors_by_time(lines, granularity="year"):
result = {}

for line in lines:
parts = line.strip().split()
if len(parts) < 3:
continue

date = parts[0]
time = parts[1]
level = parts[2]

if level != "ERROR":
continue

if granularity == "year":
key = date[:4]
elif granularity == "month":
key = date[:7]
elif granularity == "day":
key = date
else:
key = date + " " + time[:2]

result[key] = result.get(key, 0) + 1

return result

这段代码的重点不是语法,而是结构清楚:解析日志、判断级别、生成时间分组 key、累加计数。


面试官可能会追问什么?

这道题常见 follow-up 是:如果日志文件很大怎么办?

这时可以回答:真实场景中应该用 file stream,一行一行读,而不是先把整个文件读进内存。这样空间复杂度主要取决于分组数量,而不是日志文件大小。

还有一个常见追问是:如果要按不同时间粒度分组怎么办?

这时可以说,主逻辑不用变,只需要改变 time key 的生成方式。例如按年是 2023,按月是 2023-01,按天是 2023-01-10,按小时是 2023-01-10 10

这样回答会比只写一个固定按 year 分组的版本更稳。


复杂度分析

如果日志一共有 n 行,每行平均长度有限,那么时间复杂度可以看作 O(n),因为每一行只处理一次。

空间复杂度是 O(k),其中 k 是不同时间分组的数量。比如按 year 分组,k 通常很小;按 hour 分组,k 会变大一些,但仍然远小于完整日志数量。


这道题真正考什么?

这道 Intel 面试题表面上是 log parsing,实际考的是候选人处理模糊需求的能力。

面试官想看的不是候选人能不能写出几行 Python,而是能不能主动澄清日志格式,能不能避免错误判断,能不能考虑大文件场景,能不能把 group by time 设计得更灵活。

我们在辅助这类面试时,也不会只给候选人一段代码,而是会帮他组织现场表达:

First, I will clarify the log format and grouping granularity. Then I will read the file line by line, parse timestamp and log level, and only count lines where the level is ERROR. Finally, I will group the count by the required time bucket.

这样的回答更像真实工程师的解题过程,也更容易应对面试官后续追问。对于 csoahelp 来说,这正是实时面试辅助的价值:不只是写出答案,而是帮候选人在现场把思路讲清楚、把边界条件补完整、把 follow-up 接住。

csoahelp 做的就是这种场景里的实时辅助,题目刚读完就能给出完整思路,现场不用卡壳。

我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

Leave a Reply

Your email address will not be published. Required fields are marked *