首页 > 试题广场 >

小米Git

[编程题]小米Git
  • 热度指数:3956 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
Git 是一个常用的分布式代码管理工具,Git 通过树的形式记录文件的更改历史(例如示例图),树上的每个节点表示一个版本分支,工程师经常需要找到两个分支的最近的分割点。
例如示例图中 3,4 版本的分割点是 1。3,5 版本的分割点是 0。
给定一个用邻接矩阵 matrix 表示的树,请你找到版本 versionA 和 versionB 最近的分割点并返回编号。

注意:
1.矩阵中从第一行 (视为节点 0 )开始,表示与其他每个点的连接情况,例如 [01011,10100,01000,10000,10000] 表示节点 0 与节点 1 , 3 , 4相连,节点 1 与节点 0 , 2相连,其他点的以此类推。
2.并不保证是一棵二叉树,即一个节点有可能有多个后继节点,我们把节点 0 视为树的根节点。

数据范围:树上节点数量满足
示例图

示例1

输入

["01011","10100","01000","10000","10000"],1,2

输出

1
示例2

输入

["0"],0,0

输出

0
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param matrix string字符串一维数组 
# @param versionA int整型 
# @param versionB int整型 
# @return int整型
#
class Solution:
    def Git(self , matrix: List[str], versionA: int, versionB: int) -> int:
        # 第一步:创建字典,记录父级及到根节点的距离
        dictMat = {}
        i = 0
        while i < len(matrix):
            beforeLen =  len(dictMat.keys())
            if i == 0 and not dictMat.__contains__(i):
                dictMat[i] = {
                    'parent': 0,
                    'times': 0
                }
            for j in range(0, len(matrix[i])):
                if matrix[i][j] == '1' and not dictMat.__contains__(j) and dictMat.__contains__(i):
                    dictMat[j] = {
                        'parent': i,
                        'times': dictMat[i]['times'] + 1
                    }
            # 有修改则重复
            if beforeLen != len(dictMat.keys()):
                i = 0
            else:
                i += 1
        
        # 第二步:分类循环比较
        while True:
            # 0 开头
            if versionA == 0&nbs***bsp;versionB == 0:
                return 0
            # 相同位置
            elif versionA == versionB:
                return versionA
            # 相同父级
            if dictMat[versionA]['parent'] == dictMat[versionB]['parent']:
                return dictMat[versionA]['parent']
            # 互为父子
            elif dictMat[versionA]['parent'] == versionB:
                return versionB
            elif dictMat[versionB]['parent'] == versionA:
                return versionA
            else:
            # 距离根节点远的向上爬
                if dictMat[versionA]['times'] > dictMat[versionB]['times']:
                    versionA = dictMat[versionA]['parent']
                else:
                    versionB = dictMat[versionB]['parent']

发表于 2022-08-31 11:55:59 回复(0)