首页 > 试题广场 >

小米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
我的思路是,从0节点开始深度遍历,每次传入目标节点的信息,数组信息,当前节点号和上一个节点号(防止从0遍历到2,对2遍历时又遍历0这种情况)。

每次找的时候,先判断当前节点是否是目标节点,如果是,则记录下当前位置,返回查找成功;如果不是,则对该节点所连的节点进行遍历,如果找到从所连节点处找到目标节点,则记录当前位置,返回查找成功;

对两个目标节点查找完毕后,会形成两个数组,这两个数组的位置信息中从目标节点到根节点的位置信息,从最后开始查找,直到找到两个不同的节点,那么上一个相同的节点,就是需要返回的位置。

int logInfo[2][100] = {0};
int logLoc[2] = {0};
int numNo = 0;
int searchNode( int aimNode, char** matrix, int matrixLen, int loc, int pre)
{
    int i = 0, j = 0;

    if( loc == aimNode)
    {
        logInfo[numNo][logLoc[numNo]] = loc;
        logLoc[numNo]++;
        return 1;
    }
    for( i = 0; i < matrixLen; i++)
    {
        if( i == pre)
        {
            continue;
        }
        if( '1' == matrix[loc][i])
        {
            if( 1 == searchNode(aimNode, matrix, matrixLen, i, loc))
            {
                logInfo[numNo][logLoc[numNo]] = loc;
                logLoc[numNo]++;
                return 1;
            }
        }
    }
    return 0;
}
int Git(char** matrix, int matrixLen, int versionA, int versionB ) {
    // write code here
    int numA = 0; 
    int numB = 0;
    int i = 0;

    searchNode( versionA, matrix, matrixLen, 0, -1);
    numNo++;
    searchNode( versionB, matrix, matrixLen, 0, -1);
    
    numA = logLoc[0] - 1;
    numB = logLoc[1] - 1;
    
    for( i = 0; (i <= numA) && (i <= numB);i++)
    {
        if( logInfo[0][numA - i] != logInfo[1][numB - i])
        {
            return ( logInfo[0][numA - i + 1]);
        }
    }
    
    if ( i == (numA + 1))
    {
        return  logInfo[0][0];
    }
    else 
    {
        return logInfo[1][0];
    }
}


发表于 2022-02-12 11:28:18 回复(0)