小米Git

来源:互联网 发布:c语言输入多组数据 编辑:程序博客网 时间:2024/06/02 13:04

题目要求:

git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如:base'<--base<--A<--A' ^ | --- B<--B'小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。(假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0'或'1'组成,长度为n。matrix[i][j]=='1'当且仅当git树种第i个和第j个节点有连接。节点0为git树的根节点。

输入例子:
[01011,10100,01000,10000,10000],1,2
输出例子:
1

这道题看上去有点复杂,我也是读了好几遍题目才明白什么意思。其实就是一道树的遍历,两个index分别到根节点0的路径进行对比,找到离根节点最近的相同结点。由于给的情景的git版本更新,也就意味着肯定都是能到根节点的。

代码如下:

import java.util.*;public class Solution {    public int getSplitNode(String[] matrix, int indexA, int indexB) {        int l1 = matrix.length;        int l2 = matrix[0].length();        char[][] M = new char[l1][l2];        for(int i=0; i<l1; i++) {            char [] tmp = matrix[i].toCharArray();            for(int j=0; j<l2; j++) {                M[i][j] = tmp[j];            }        }List<Integer> lA = new ArrayList<>();        List<Integer> lB = new ArrayList<>();        lA = DFS(M, indexA);        lB = DFS(M, indexB);        int l=0, res=0;        if(lA.size()>lB.size())            l = lB.size();        else            l = lA.size();        //输出路径中最后一个相同结点        for(int i=0; i<l; i++) {            if(lA.get(i)==lB.get(i))                res = lA.get(i);        }        return res;    }    //DFS深搜   public List<Integer> DFS(char[][] m, int index) {        boolean[] visited = new boolean[m.length];        visited[0] = true;        Stack<Integer> s = new Stack<>();        s.push(0);        List<Integer> res = new ArrayList<>();        res.add(0);        while(s.peek()!=index) {            boolean findnext = false;            int p = s.peek();            for(int i=0; i<m.length; i++) {                if(m[p][i]=='1' && !visited[i]) {                    p = i;                    s.push(i);                    res.add(i);                    findnext = true;                    visited[i] = true;                    break;                }            }            if(!findnext) {                s.pop();                res.remove(res.size()-1);            }        }        return res;    }}
这里我用了DFS深搜算法,由于确定能从根节点找到两个index,所以我就有恃无恐的搜啊搜啊,直到找到index,使得s,peek()==index,这时我就可以把这条路径送回到主函数了。两个都找完之后,把两条路径进行对比,要的是最近分割点,所以就是从头开始对比,一直到最后一个相等的被记录下来,整个for循环结束了,我的res也就找到了。

0 0
原创粉丝点击