华为ai算法 华为笔试 华为秋招 1029

笔试时间:2025年10月29日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:实体匹配结果合并问题

某业务部门有多个数据来源,现在需要对多个来源的实体数据进行去重、消歧、合并。有多个实体匹配系统(假设系统的匹配结果完全正确),每个系统会从不同角度进行匹配,匹配结果是相同实体列表。

这些匹配结果中往往存在交叉重复的问题,需要对所有匹配结果进行合并去重。例如系统A的匹配结果是 [1,2,3],系统B的匹配结果是 [2,3,4],那么合并后的匹配结果是 [1,2,3,4]。请你按照上述逻辑,编写代码实现对匹配结果的合并去重。

输入描述

  • 第一行输入是整型 N,表示有 N 个实体匹配系统,1 ≤ N ≤ 10000
  • 接下来 N 行是每个实体匹配系统的匹配结果(相同实体列表,每行实体数量不超过100)
  • 实体使用数字字符串表示(字符长度不超过10),实体之间通过空格分开,实体种类数量不超过100000
  • 输出描述

    输出 M 行(M ≤ N),每行内容是合并后的匹配结果。

    注意

    • 每行的输出结果需要按照字典序进行排序
    • 合并后的匹配结果列表之间,也需要按字典序进行排序

    样例输入

    5

    1 2 3

    4 5

    11 22

    33 44 55 1

    3 66

    样例输出

    1 2 3 33 44 55 66

    11 22

    4 5

    解释:

    匹配结果"1 2 3"、"33 44 55 1"、"3 66",存在重复实体"1"和"3",故可以合并,合并后按字典序为"1 2 3 33 44 55 66";另外两组结果与其他组不存在重复;合并后的匹配结果列表之间,按字典序排序后输出,即样例输出所示内容。

    参考题解

    这个问题本质上是合并具有公共元素的集合,属于典型的并查集应用场景。

    核心思路

    1. 问题转化:将每个匹配结果视为一个集合,如果两个集合有公共元素,说明它们应该合并
    2. 关键观察:如果实体A和B在同一行,实体B和C在同一行,那么A、B、C应该属于同一个实体组
    3. 算法选择:使用并查集来高效处理集合合并操作

    Python:

    import sys
    from collections import defaultdict
    
    sys.setrecursionlimit(200000)
    
    parent = {}
    
    def find(i):
        if i not in parent:
            parent[i] = i
            return i
        if parent[i] == i:
            return i
        parent[i] = find(parent[i])
        return parent[i]
    
    def union(i, j):
        root_i = find(i)
        root_j = find(j)
        if root_i != root_j:
            parent[root_i] = root_j
    
    def solve():
        n = int(sys.stdin.readline())
        lines_to_process = []
        
        for _ in range(n):
            entities = sys.stdin.readline().split()
            lines_to_process.append(entities)
            for entity in entities:
                if entity not in parent:
                    parent[entity] = entity
        
        for entities in lines_to_process:
            first_entity = entities[0]
            for i in range(1, len(entities)):
                union(first_entity, entities[i])
        
        groups = defaultdict(set)
        for entity in parent:
            root = find(entity)
            groups[root].add(entity)
        
        final_merged_lists = []
        for group_set in groups.values():
            sorted_group = sorted(list(group_set))
            final_merged_

    剩余60%内容,订阅专栏后可继续查看/也可单篇购买

    2025 春招笔试合集 文章被收录于专栏

    2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

    全部评论

    相关推荐

    11-19 18:44
    已编辑
    成都理工大学 Java
    程序员花海:我面试过100+校招生,大厂后端面试不看ACM,竞赛经历含金量低于你有几份大厂实习 这个简历整体来看不错 可以海投
    如何写一份好简历
    点赞 评论 收藏
    分享
    评论
    点赞
    收藏
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务