通过率 0% · 提交 0 · 通过 0
训练数据集有 n 条记录,每条记录是一个不含空白字符的字符串。清洗管线由 q 个步骤组成,按输入顺序逐个执行;每个步骤把一种规则作用于当前整个数据集,完成后再进入下一个步骤。四种规则的含义固定如下: - dedup:去重。按当前字符串值,保留首次出现的记录,删除后续重复记录。 - dropna:删除值恰好为 NULL 或恰好为 - 的记录(区分大小写)。 - short:删除长度小于 3 的记录。 - lower:把每条记录中的大写英文字母改为小写,其他字符不变。 执行完全部步骤后,输出剩余记录条数,并按顺序输出前 m 条(不足 m 条则全部输出)。
这类题属于算法机考高频题型中「华为 AI 岗 / 字符串」方向的高频题型,通常考察对「华为 AI 岗 / 字符串」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行输入三个整数 n q m。接下来 n 行,每行输入一条记录。随后 q 行,每行输入一个规则名,取值为 dedup、dropna、short、lower 之一。
第一行输出剩余记录条数 r。随后 min(r, m) 行,每行输出一条清洗后的记录,按数据集中的先后顺序。
示例 1
输入示例
4 2 10 Cat cat NULL Do lower dedup
输出示例
3 cat null do
lower 之后 NULL 变成 null,不再是缺失标记
示例 2
输入示例
4 2 10 NULL - abc abc dropna dedup
输出示例
1 abc
先删缺失标记再去重
时间限制 2500 ms · 内存限制 256 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这些是真正决定能不能 AC、但通用题解里常被略过的点。
纯模拟 + 哈希去重,考的是「按规格逐条实现」的工程能力:四种规则每条语义都写死了,顺序敏感是唯一的思维点,剩下全是手上功夫。机考里这类题分值不高但必须快、必须一次对——它是用来省时间给难题的。
规则按输入顺序逐个作用于整个数据集,做完一个再做下一个。示例 1 就是陷阱本体:先 lower 再 dedup 时,NULL 变成 null,不再命中 dropna 的缺失标记(dropna 只认恰好 NULL 或 -,区分大小写);反过来先 dropna 再 lower,NULL 早就被删了。实现时严格「一轮一规则」,别把几条规则合并进一次遍历——合并版在顺序敏感的用例上必挂。
每条规则一次线性扫,新建列表接住存活记录(边遍历边删是各语言的经典事故现场)。O(总字符数 × q),n = 10 万、q ≤ 10,轻松。q = 0 时直接输出原数据——这个边界组在册。
第一行是剩余条数 r,随后输出 min(r, m) 条。r 和 m 的关系别搞反:条数照实输出,记录最多 m 条。
参考实现把数据集存成 list,每读一条规则就整轮处理:dedup 用 set 记见过的值、顺序保留首现;dropna/short 用列表推导过滤;lower 逐条替换。四条规则各自独立成函数,主循环按输入顺序调度——结构和题面一一对应,读起来就是题面的翻译。
n = 10 万、记录长 ≤ 30、q ≤ 10,总字符量 300 万,每规则线性扫,Python 也就百毫秒级。这道题真正的时间成本在读题:四条规则的语义、大小写敏感、恰好相等还是包含——花两分钟把规则逐条抄成注释再动手,比写完再对着 WA 猜快得多。
1. 样例 1 正序(lower→dedup)与手动反序(dedup→lower):前者 3 条(null 活着),后者 Cat/cat 各自算不同值——两个结果都手算一遍,确认你的实现是「按输入顺序」而不是固定顺序。 2. q = 0:原样输出 n 条(最多 m 条),验证空管线不炸。 3. 记录 "ab":short 删长度 < 3,两字符要删、三字符要留,边界是严格小于。
# 纯模拟:严格一轮一规则,每条规则线性扫、新建列表接存活记录
# 顺序敏感:lower 在 dropna 前会让 NULL 变 null 逃过删除
import sys
def solve() -> None:
data = sys.stdin.buffer.read().split()
if not data:
return
n = int(data[0]); q = int(data[1]); m = int(data[2])
records = [data[3 + i].decode() for i in range(n)]
rules = [data[3 + n + i].decode() for i in range(q)]
for rule in rules:
if rule == "dedup":
seen = set()
kept = []
for r in records:
if r not in seen:
seen.add(r)
kept.append(r)
records = kept
elif rule == "dropna":
records = [r for r in records if r != "NULL" and r != "-"]
elif rule == "short":
records = [r for r in records if len(r) >= 3]
elif rule == "lower":
records = [r.lower() for r in records]
out = [str(len(records))]
out.extend(records[:m])
sys.stdout.write("\n".join(out) + "\n")
solve()
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有